Oop 以各种格式保存/加载对象的设计模式
我有一个对象:X,可以以各种格式保存或加载:TXT、PDF、HTML等Oop 以各种格式保存/加载对象的设计模式,oop,design-patterns,Oop,Design Patterns,我有一个对象:X,可以以各种格式保存或加载:TXT、PDF、HTML等 管理这种情况的最佳方法是什么?为每种格式向X添加一对方法,为每种格式创建一个新类,或者存在(我相信)一个更好的解决方案?我会选择Factory模式。看起来您可以将继承/多态性与泛型一起使用。如果使用类似的设计,您甚至可以进行依赖项注入,如下所示 public interface IDocument { void Save(); } public class Document : IDocument { } pu
管理这种情况的最佳方法是什么?为每种格式向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这样的实现类时,为什么你会需要常量,但是你可以用任何你想要的方式来解决这个问题,模式只是解决已知问题的一种常用方法的建议,而不是刻在石头上。我相信我在这里给出的解决方案是实现它的常用方法,但是请随意改变它。您可以在此处了解更多信息: