【发布时间】:2018-09-22 02:06:45
【问题描述】:
按功能和装饰器模式的文件夹
如果我有一个Parser 和一个关联的Stream,当我通过Tokens 时,我正在改变对象的状态,因为Stream 正在向前移动。我想在这个解析器中添加特定于应用程序的功能来维护单一职责的原则,所以我认为装饰器设计模式是一个合适的选择。我现在将Parser 包装在ParserDecorator(Parser) 中并添加特定的函数,例如readPerson() 或readItem(),将数据映射到Object 并返回Object。
首先,我考虑在Person 中创建一个静态函数,将Parser 作为参数;但是,该函数会处理流,我认为这在所有情况下都不是线程安全的。但是,由于ParserDecorator 返回不同类型的对象,因此无法将其与Person 逻辑分组。因此,如果我稍后更改 Person 类,我必须记住更改 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;
}
}
【问题讨论】:
-
你能详细说明解析器装饰器返回的对象是什么类型的吗?
-
在我看来,Decorator 不是您正在寻找的模式。如果每个解析的标记都需要相同的(尽管是模块化的)处理步骤集,那么装饰器将很有用。但是在您的情况下,处理
PersonvsItem令牌可能有所不同。桥接模式将允许您对 1) 令牌类型和 2) 令牌类型特定的解析行为进行抽象。 -
例如,我添加了带有 JsonParser 的代码,并将 Item 作为对象来演示我如何尝试构建程序。
标签: java decorator directory-structure