JsonGenerator可以在同一调用中写入OutputStream和Writer吗?

问题描述

是否存在一种优雅的解决方案或模式,以便一次调用writeStartObject()可以应用于Writer和OutputStream?

        try (
        JsonGenerator output = jfactory.createGenerator(outputWriter); // writer
        JsonGenerator cachingOutput = jfactory.createGenerator(cachingService.getCachingOutputStream(id));//outputstream
    ) {
        output.writeStartObject();
        cachingOutput.writeStartObject();
        ...

解决方法

由于要考虑内聚性和耦合性准则,因此您可能要考虑是否将这两者真正绑定在一起。例如,如果您需要将writeroutputStream用于其他用途,并且要在广泛程度上使用,则应将它们分开使用,除非这种广泛使用在两者之间均得到了反映。最好将这两个都隐藏在两个独立的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-idSimultaneousFeed不应该知道的数据。这使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,});

});