Oop 以各种格式保存/加载对象的设计模式

Oop 以各种格式保存/加载对象的设计模式,oop,design-patterns,Oop,Design Patterns,我有一个对象:X,可以以各种格式保存或加载:TXT、PDF、HTML等 管理这种情况的最佳方法是什么?为每种格式向X添加一对方法,为每种格式创建一个新类,或者存在(我相信)一个更好的解决方案?我会选择Factory模式。看起来您可以将继承/多态性与泛型一起使用。如果使用类似的设计,您甚至可以进行依赖项注入,如下所示 public interface IDocument { void Save(); } public class Document : IDocument { } pu

我有一个对象:X,可以以各种格式保存或加载:TXT、PDF、HTML等


管理这种情况的最佳方法是什么?为每种格式向X添加一对方法,为每种格式创建一个新类,或者存在(我相信)一个更好的解决方案?

我会选择Factory模式。看起来您可以将继承/多态性与泛型一起使用。如果使用类似的设计,您甚至可以进行依赖项注入,如下所示

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

这取决于您的对象,但也有可能是访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern)可以在这里使用。
有不同的访问者(PDFVisitor、HHTMLVisitor等)知道如何序列化他们访问的对象的一部分。

我同意@DarthVader,不过最好用Java编写

public class XDocument implements IDocument { ...

如果文档中有很多行为是通用的,那么您也可以使用抽象类,并且在基类的常用方法中调用抽象
save()
,它只在子类中实现。

我建议使用策略模式。你总是在保存和恢复,唯一的区别是你如何做(你的策略)。因此,您有
save()
restore()
方法,这些方法遵循各种
FormatStrategy
对象,您可以在运行时即插即用。

我会选择策略模式。例如:

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

您将用哪种编程语言实现解决方案?我可以提出各种方法,但其中一些方法是通过语言/平台的特定功能实现的。。。NET中的委托、Java中的匿名类等。问题是我的X对象可以作为TxtDocument生成,但同一个对象可能保存为PDF。使用此解决方案,如果我加载txt文档,它不能保存为PDF,因为两者都是IDocument,但txt文档不是PDF。如果不是这样,您应该能够将txt文档保存为PDF文档。不?如果X负责战略,你认为如何?我的意思是X可以有一个嵌套的接口
XStrategy
,一个属性
XStrategy
,并提供一些通用的实现,如
final static
,比如PDF\u策略、TXT\u策略等等?我真的不知道当你有像PdfStartegy这样的实现类时,为什么你会需要常量,但是你可以用任何你想要的方式来解决这个问题,模式只是解决已知问题的一种常用方法的建议,而不是刻在石头上。我相信我在这里给出的解决方案是实现它的常用方法,但是请随意改变它。您可以在此处了解更多信息: