Папка по функциям и шаблон дизайна - PullRequest
0 голосов
/ 22 сентября 2018

Шаблон папок по элементам и декоратор

Если у меня есть 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;
    }
}

1 Ответ

0 голосов
/ 22 сентября 2018

Я пришел к решению, подумав об этом в одночасье.Я создал новый класс с именем ItemJson и добавил методы read(JsonParser jsonParser) и write(JsonGenerator jsonGenerator, Item item).Это объединяет все подобные классы / функции и обрабатывает переформатирование данных в одном отдельном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...