问题描述
是否存在一种优雅的解决方案或模式,以便一次调用writeStartObject()可以应用于Writer和OutputStream?
try (
JsonGenerator output = jfactory.createGenerator(outputWriter); // writer
JsonGenerator cachingOutput = jfactory.createGenerator(cachingService.getCachingOutputStream(id));//outputstream
) {
output.writeStartObject();
cachingOutput.writeStartObject();
...
解决方法
由于要考虑内聚性和耦合性准则,因此您可能要考虑是否将这两者真正绑定在一起。例如,如果您需要将writer
或outputStream
用于其他用途,并且要在广泛程度上使用,则应将它们分开使用,除非这种广泛使用在两者之间均得到了反映。最好将这两个都隐藏在两个独立的Data Access Objects后面,在这里可以将它们的使用区分开来,并根据访问它们的目的以描述性的方式公开其操作-更适合您的业务。
无论是有限使用还是广泛使用,为了在整个货币对中均等使用,我可以这样使用façade:
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
会在新实例中引发data coupling-id
是SimultaneousFeed
不应该知道的数据。这使SimultaneousFeed
仅关注输出数据,从而提高了可重用性和可维护性。
要考虑的另一种模式是Decorator模式,前提是您能够将jfactory
实例的类和JsonGenerator
类的子类化。这将允许您创建自定义JsonGenerator
,该自定义writeStartObject()
在jfactory
方法的重写实现中同时写入两个输出。在这种情况下,您可以在public JsonGenerator createSimultaneousGenerator(OutputStream outputStream,Writer outputWriter) {
return new SimulJsonGenerator(outputStream,outputWriter);
}
类中提供一个方法:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$('.infinite-scroll').on('click','#editPostButton',function(e) {
e.preventDefault();
var id = $(this).data('id');
var user_id = $('#userForm').val();
var form = document.getElementById('EditPostForm'+id);
var formData = new FormData(form);
// var formData = $('#EditPostForm'+id).serialize();
$.ajax({
url: "id"+user_id+"/"+id+"/edit",type: "POST",data: formData,success: function(data) {
console.log(data);
$("#userPost"+id).html(data);
$("#closeButton"+id).click();
},error: function() {
console.log('error');
},processData: false,contentType: false,});
});