Шаблон папок по элементам и декоратор
Если у меня есть Parser
, с которым связан Stream
, когда я прохожу через Tokens
, я изменяю состояние объекта какStream
движется вперед.Я хочу добавить в этот синтаксический анализатор специфичные для приложения функции, чтобы сохранить принцип единоличной ответственности, поэтому я подумал, что шаблон проектирования Decorator является подходящим выбором.Теперь я обертываю 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;
}
}