我有一個對象:X,可以保存或以各種形式加載:TXT,PDF,HTML等。設計模式保存/加載對象以各種格式
什麼是最好的方式管理這種情況?爲每種格式在X中添加一對方法,爲每種格式創建一個新的類,或者存在(如我所信任的)更好的解決方案?
我有一個對象:X,可以保存或以各種形式加載:TXT,PDF,HTML等。設計模式保存/加載對象以各種格式
什麼是最好的方式管理這種情況?爲每種格式在X中添加一對方法,爲每種格式創建一個新的類,或者存在(如我所信任的)更好的解決方案?
我會選擇策略模式。例如:
interface XStartegy {
X load();
void save(X x);
}
class TxtStrategy implements XStartegy {
//...implementation...
}
class PdfStrategy implements XStartegy {
//...implementation...
}
class HtmlStrategy implements XStartegy {
//...implementation...
}
class XContext {
private XStartegy strategy;
public XContext(XStartegy strategy) {
this.strategy = strategy;
}
public X load() {
return strategy.load();
}
public void save(X x) {
strategy.save(x);
}
}
您認爲X是否對策略負責?我的意思是說X可以有一個嵌套接口'XStrategy',一個屬性'xstrategy',並且提供一些公共實現作爲'final static'如PDF_STRATEGY,TXT_STRATEGY等等。 –
我不知道爲什麼當你實現像PdfStartegy這樣的類時你需要常量,但是你可以用任何你想要的方式解決這個問題,這些模式只是解決已知問題的常用方法的建議,而不是刻在石頭。我相信我在這裏給出的解決方案是實現它的常用方法,但無論如何隨時都可以隨意更改它。你可以在這裏閱讀更多關於它的信息:http://www.oodesign.com/strategy-pattern.html – uzilan
我會去工廠模式。看起來你可以在泛型中使用繼承/多態。如果你使用類似的設計,你甚至可以進行依賴注入。
public interface IDocument
{
void Save();
}
public class Document : IDocument
{
}
public class PdfDocument: IDocument
{
public void Save(){//...}
}
public class TxtDocument: IDocument
{
public void Save(){//...}
}
public class HtmlDocument : IDocument
{
public void Save(){//...}
}
然後在另一個類,你可以這樣做:
public void SaveDocument(T document) where T : IDocument
{
document.save();
}
問題是我的X對象可能是TxtDocument,但同一個對象可能會保存爲PDF。有了這個解決方案,如果我加載TxtDocument,它不能保存爲PDF,因爲它們都是IDocument,但TxtDocument不是PDF。 –
是不是這樣的情況下,你應該能夠保存一個PDF文檔以及TXT文件。沒有? – DarthVader
這取決於你的對象,但它是可能的,即訪問者模式(http://en.wikipedia.org/wiki/ Visitor_pattern)可以在這裏使用。 有不同的訪問者(PDFVisitor,HHTMLVisitor等)知道如何序列化他們訪問的對象的部分。
我同意@DarthVader,雖然在Java中你最好寫
public class XDocument implements IDocument { ...
你也可以使用一個抽象類,如果很多行爲是共同的文件,並在基類的常用方法調用一個摘要save()
,它只在子類中實現。
我會改爲建議策略模式。你總是保存和恢復,唯一的區別是你如何做(你的策略)。因此,您有save()
和restore()
方法可以根據運行時可以插入和播放的各種各樣的FormatStrategy
對象。
您將採用哪種編程語言來實現該解決方案?我可以推薦各種方法,但其中一些方法是通過語言/平臺的特定功能來實現的...... .NET中的委託,Java中的匿名類等。 –
我正在使用Java。 –