Является ли шаблон цепочки ответственности хорошей заменой последовательности условий? - PullRequest
0 голосов
/ 08 декабря 2018

Когда вам нужно выполнить последовательность действий в определенном порядке, является ли шаблон цепочки ответственности хорошей заменой последовательности условий?Является ли хорошей идеей заменить простой метод такими условиями:

public class MyListener implements MyHttpListener {

    // if false, the request will be thrown away and subsequent listeners will not be notified
    @Override
    public boolean onHttpRequestSend(HttpMessage msg) { 
        // handlers can change msg

        boolean isA = handleA(msg);
        if (isA) return false;

        boolean isB_notA = handleB(msg);
        if (isB_notA) return false;

        boolean isC_notA_notB = handleC(msg);
        if (isC_notA_notB) return true;

        ...

        throw new IllegalStateException();
    }
}

Теперь замените его реализацией шаблона цепочки ответственности:

public class MyListener implements MyHttpListener {
    @Override
    public boolean onHttpRequestSend(HttpMessage msg) {
        ProcessingStep first = new StepA()
        ProcessingResult result = first.process(new ProcessingResult(msg, true));
        return result.returnValue;
    }
}

public interface ProcessingStep {
    ProcessingResult process(ProcessingResult stepResult);
}

public class ProcessingResult {
    HttpMessage message;
    boolean returnValue;
}

public class StepA implements ProcessingStep {
    @Override
    public ProcessingResult process(ProcessingResult stepResult) {
        if (handleA()) {
            return stepResult;
        }
        else {
            return new StepB().process(stepResult);
        }
    }
}   
public class StepB implements ProcessingStep {
    @Override
    public ProcessingResult process(ProcessingResult stepResult) {
        return stepResult; // this is the last step
    }
}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Цепочка ответственности предназначена для точного сценария, который вы описываете, т. Е. Замена цепочки if ... else одним вызовом, который обрабатывает ваш запрос (в вашем примере - msg).).

Итак, ответ таков: да, ваш второй код является хорошей заменой вашего первого кода.


Нужно ли заменять свой первый фрагмент кода на второй:Другой вопрос.Для такого простого кода, как тот, который у вас есть в настоящее время, добавление шаблона проектирования может оказаться излишним.Дополнительными причинами использования этого шаблона являются:

  • Динамическое расположение блоков if ... else;
  • Добавление новых блоков обработки;
  • Повторное использование обработчиков как диспетчеры , способные отправлять msg в различных направлениях, образуя Дерево ответственности .

  • Если ваша ситуацияПохоже, что он требует шаблона проектирования, продолжайте.
  • Если нет, оставьте его.
  • Если вы сомневаетесь, добавьте шаблон сейчас.Если в будущем вы / ваши товарищи по команде запутаетесь в коде, удалите его в это время.
0 голосов
/ 08 декабря 2018

Ваша реализация шаблона Chain of Responsibility не является точной реализацией, поскольку обычно каждый элемент цепочки обработчиков не должен знать, что будет дальше.

Однако давайте посмотрим наОсновное преимущество шаблона CoR: оно позволяет динамически изменять цепочку обработчиков во время выполнения (что может быть недоступно в жестко закодированных рядах условий).Таким образом, если вам нужно динамическое поведение шаблона CoR, вы можете извлечь из этого пользу, но если нет, то это можно считать ненужным чрезмерно спроектированным решением.

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