Является ли модель цепочки ответственности просто излишним? Список обработчиков может выполнить то же самое - PullRequest
0 голосов
/ 04 мая 2019

В шаблоне «Цепочка ответственности (COR)» мы создаем цепочку обработчиков.Передайте запрос первому в цепочке.Он пытается справиться с этим.Если это невозможно, он пересылает запрос следующему в цепочке и так далее.Например.Handler1 = новый ConcreteHandler1 ();handler1.handle

public class ConcreteHandler1
    public void handle() {
        if(can handle)
            handle the request
        else 
            concreteHandler2.handle(); 
    }

Разве мы не можем просто создать список обработчиков и выполнить то же самое в цикле for?

for(Handler handler : handlers) {
    if(handler can handle the request)
        handle
}

Мы создадим список обработчиков так же, как мысоздать цепочку.

  1. Каким образом это для цикла уступает COR?Разве COR - это не просто перебор?
  2. Существуют ли сценарии, в которых цикл for лучше, а в других, где COR лучше?В вашем ответе - было бы здорово, если бы вы сначала ответили на эти вопросы с помощью Да / Нет, прежде чем углубляться в подробное объяснение.

Я знаю, что по этому вопросу уже есть пост - Что такоепреимущества цепочки ответственности перед списками классов? но это не проясняет мои сомнения.

1 Ответ

3 голосов
/ 04 мая 2019

Цепочка организована рекурсивно, так что обработчик может:

  • Выполнить некоторую работу до следующего запуска обработчика, включая изменение ввода для следующего обработчика;AND
  • Выполните некоторую работу после следующего запуска обработчика, включая обработку или изменение вывода следующего обработчика, прежде чем он будет возвращен предыдущему обработчику;AND
  • Используйте информацию, которую она хранила до запуска следующего обработчика, чтобы впоследствии повлиять на вывод.

Рекурсия - это самый простой и простой способ организовать все это.Чтобы разрешить аналогичную функциональность без рекурсии, потребовалось бы больше обратных вызовов и более сложный жизненный цикл обработчика.

Когда обработчики не производят никакого вывода, как обработчики событий HTML, выполнение работы как до, так и после не требуется.В этих случаях обработчики событий обычно вызываются итеративно, как вы предлагаете.

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