2011-12-05 47 views
4

我有一個對象:X,可以保存或以各種形式加載:TXT,PDF,HTML等。設計模式保存/加載對象以各種格式

什麼是最好的方式管理這種情況?爲每種格式在X中添加一對方法,爲每種格式創建一個新的類,或者存在(如我所信任的)更好的解決方案?

+0

您將採用哪種編程語言來實現該解決方案?我可以推薦各種方法,但其中一些方法是通過語言/平臺的特定功能來實現的...... .NET中的委託,Java中的匿名類等。 –

+0

我正在使用Java。 –

回答

3

我會選擇策略模式。例如:

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); 
    } 
} 
+0

您認爲X是否對策略負責?我的意思是說X可以有一個嵌套接口'XStrategy',一個屬性'xstrategy',並且提供一些公共實現作爲'final static'如PDF_STRATEGY,TXT_STRATEGY等等。 –

+0

我不知道爲什麼當你實現像PdfStartegy這樣的類時你需要常量,但是你可以用任何你想要的方式解決這個問題,這些模式只是解決已知問題的常用方法的建議,而不是刻在石頭。我相信我在這裏給出的解決方案是實現它的常用方法,但無論如何隨時都可以隨意更改它。你可以在這裏閱讀更多關於它的信息:http://www.oodesign.com/strategy-pattern.html – uzilan

0

我會去工廠模式。看起來你可以在泛型中使用繼承/多態。如果你使用類似的設計,你甚至可以進行依賴注入。

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(); 
} 
+0

問題是我的X對象可能是TxtDocument,但同一個對象可能會保存爲PDF。有了這個解決方案,如果我加載TxtDocument,它不能保存爲PDF,因爲它們都是IDocument,但TxtDocument不是PDF。 –

+0

是不是這樣的情況下,你應該能夠保存一個PDF文檔以及TXT文件。沒有? – DarthVader

0

這取決於你的對象,但它是可能的,即訪問者模式(http://en.wikipedia.org/wiki/ Visitor_pattern)可以在這裏使用。 有不同的訪問者(PDFVisitor,HHTMLVisitor等)知道如何序列化他們訪問的對象的部分。

1

我同意@DarthVader,雖然在Java中你最好寫

public class XDocument implements IDocument { ... 

你也可以使用一個抽象類,如果很多行爲是共同的文件,並在基類的常用方法調用一個摘要save(),它只在子類中實現。

0

我會改爲建議策略模式。你總是保存和恢復,唯一的區別是你如何做(你的策略)。因此,您有save()restore()方法可以根據運行時可以插入和播放的各種各樣的FormatStrategy對象。