是否有一个优雅的解决方案或模式,以便 writeStartObject() 的一个调用可以同时应用于编写器和输出流?
try (
JsonGenerator output = jfactory.createGenerator(outputWriter); // writer
JsonGenerator cachingOutput = jfactory.createGenerator(cachingService.getCachingOutputStream(id));//outputstream
) {
output.writeStartObject();
cachingOutput.writeStartObject();
...
您可能需要考虑这两者是否真的应该绑定在一起,因为需要考虑内聚和耦合准则。 例如,如果您需要将writer
或outputStream
用于其他用途,并且在很大程度上,那么您应该将它们分开,除非这种广泛使用在两者中得到平等的反映。 最好将这两个隐藏在两个独立的数据访问对象后面,在那里它们的使用可以划分,根据访问它们的目的以描述性方式公开它们的操作 - 更适合您的业务。
无论是有限使用还是广泛使用,为了在对中平等使用,我可能会应用这样的外观:
class SimultaneousFeed {
private JFactory jFactory;
private JsonGenerator out;
private JsonGenerator writer;
SimultaneousFeed(JFactory jFactory, OutputStream outputStream, Writer outputWriter) {
this.jFactory = jFactory;
this.out = jfactory.createGenerator(outputStream);
this.writer = jfactory.createGenerator(outputWriter);
}
void writeStartObject() {
out.writeStartObject();
writer.writeStartObject();
}
...
// other operations common to the pair of these outputs
}
...
SimultaneousFeed feed = new SimultaneousFeed(jFactory, cachingService.getCachingOutputStream(id),
outputWriter);
feed.writeStartObject();
请注意,我正在将OutputStream
传递给新的SimultaneousFeed
实例,而不是传递id
。 传递id
会在新实例中提高数据耦合 -id
是SimultaneousFeed
应该一无所知的数据。 这允许SimultaneousFeed
只关注输出数据,从而提高可重用性和可维护性。
要考虑的替代模式是装饰器模式,前提是您能够子类化jfactory
实例的类和JsonGenerator
类。 这将允许您创建一个自定义JsonGenerator
,该在writeStartObject()
方法的重写实现中同时写入两个输出。 在这种情况下,您可以在jfactory
类中提供一个方法:
public JsonGenerator createSimultaneousGenerator(OutputStream outputStream, Writer outputWriter) {
return new SimulJsonGenerator(outputStream, outputWriter);
}