繁体   English   中英

按功能的文件夹和装饰器设计模式

[英]Folder-by-feature and decorator design pattern

按功能的文件夹和装饰器模式

如果我有一个具有关联的StreamParser ,则当我逐步处理Tokens ,我将在Stream向前移动时改变对象的状态。 我想向该解析器添加特定于应用程序的功能,以维持单一职责的原则,因此我认为Decorator设计模式是一个适当的选择。 现在,我将Parser包装在ParserDecorator(Parser)并添加特定的功能,例如将数据映射到Object并返回该Object readPerson()readItem()

首先,我考虑在Person中创建一个静态函数,以Parser作为参数。 但是,该函数将继续处理流,因此我决定并非在所有情况下都是线程安全的。 但是,由于ParserDecorator返回不同类型的对象,因此无法将其仅与Person逻辑分组。 因此,如果以后更改Person类,我必须记住要更改ParserDecorator读取它的方式,该ParserDecorator位于程序的不同部分,项目中的新开发人员可能不会检查该位置。 通常,我按功能部署文件夹,因此所有需要进行的更改都放在一起,但是在这种情况下不起作用。

使用纯面向对象的方法,是否有更好的解决方案? 现在,我有一个名为util的独立功能文件夹,其中包含此类。

编辑:示例代码:

public class JsonParserDecorator {
    private final JsonParser jsonParser;

    public JsonParserDecorator(JsonParser jsonParser) {
        this.jsonParser = jsonParser;
    }

    public Item readItem() throws IOException {
        Item item = new Item();

        if (jsonParser.currentToken() != JsonToken.START_OBJECT) {
            throw new IOException("JSON object expected");
        }

        while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = jsonParser.currentName();
            jsonParser.nextToken();

            switch (fieldName) {
                case "itemId":
                    item.setId(jsonParser.getLongValue());
                    break;
                case "description":
                    item.setDescription(jsonParser.getText());
                    break;
                default:
                    break;
            }
        }

        return item;
    }
}

经过一整夜的思考,我得出了一个解决方案。 我创建了一个名为ItemJson的新类,并添加了read(JsonParser jsonParser)write(JsonGenerator jsonGenerator, Item item)方法。 这样可以将所有类似的类/功能组合在一起,并在一个单独的类中处理数据的重新格式化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM