假设您要将某些文档导出到文件中(以某种格式,例如XML)。
为此,我有XmlExporter类,问题是...将Document和File传递给此类的最佳方法是什么?
选项1:
导出器是无状态的,因此,如果要导出其他文档或导出到其他文件,只需更改参数即可。缺点是我必须在每个方法中传递文件(或更确切地说是OutputStream)(在复杂文档的情况下可能会很多)
class XmlExporter {
public function export(Document document, File file) {
this.writeHeader(document.header, file);
this.writeSomeOtherStuff(document.somethingElse, file);
// and more ...
}
private function writeHeader(DocumentHeader header, File file) {
writeName(header.name, file); // passing file over and over again
}
}
选项2:
源和目标都存储在实例中。如果要更改文件,则必须创建一个新对象,但是现在,我不必担心传递所有必要的数据。
class XmlExporter {
private final Document document;
private final File file;
public XmlExporter(Document document, File file) {
this.document = document;
this.file = file;
}
public function export() {
this.writeHeader(this.document.header);
}
private function writeHeader(DocumentHeader header) {
this.writeName(header.name);
}
private function writeName(String name) {
// ...
}
}
选项3:
两者结合
class DocumentExporter {
public static function exportToXml(Document document, File file) {
XmlExporter exporter = new XmlExporter(document, file);
exporter.export();
}
// the rest same as Option 2, probably with private constructor
}
基本上,从编写类的角度来看,第二种选择对我来说最有意义,因为我不需要传递目标文件/流。但是从实际使用的角度来看,我认为首选会更有意义。如果我想将其导出到标准输出而不是文件中,或者导出多个文档怎么办?
最佳答案
首先,我将选择选项2以支持以后扩展导出过程(实例中的存储状态,进度等)。如果希望它们可以更改,则可以为文件和文档添加公共属性。
如果我想将其导出到标准输出而不是文件中,该怎么办?
导出多个文件?
尝试解耦XmlExporter类的功能。 XmlExporter应该是Director,其职责是解析文档并在运行时通知附加的Handler(接口)-一个Handler实现可以将数据写入File,另一个可以写入控制台。
查看构建器设计模式:http://www.blackwasp.co.uk/Builder.aspx