Шаблон проектирования цепочки ответственности предлагает обрабатывать запрос клиента, передавая его в цепочку объектов. Затем объекты сами решат, какой объект продолжит выполнение запроса клиента или передаст его следующему объекту. Основной целью этого шаблона проектирования является достижение слабой связи в программных приложениях.

Давайте рассмотрим случай, когда у клиента есть запрос на продолжение, но из-за сложности структуры объекта запрос может быть неуместен. В этом случае Шаблон проектирования цепочки ответственности позволит избежать такой сложности за счет использования только одного обработчика, который не обязательно должен быть конкретным и позволяет определять фактические обработчики во время выполнения. Это упростило бы использование приложения.

Посмотрим на реальном примере. В нашем случае у нас есть разные объекты Person, которые должны быть разделены по возрасту. Во-первых, мы создадим абстрактный класс Processor, который будет вести себя как основной обработчик:

Затем мы создадим объект Person для использования в качестве объекта, который будет использоваться клиентом в запросе:

Далее мы создадим конкретные обработчики, связанные в некотором последовательном порядке для фактической обработки запроса:

А теперь пришло время создать настоящий объект цепочки, который инициирует и связывает конкретные обработчики и получает запрос клиента:

Использование будет таким:

И вывод:

Как мы видим, запросы обрабатываются путем передачи запроса только одному обработчику и обрабатываются несколькими конкретными обработчиками.

Этот шаблон используется, когда разделение отправителя и получателя запроса имеет высокий приоритет, и запрос, как правило, обрабатывается несколькими кандидатами, которые определяются во время выполнения или точно не уверены, какой из них должен обрабатывать запрос.

Кроме того, этот шаблон проектирования позволяет избежать явного указания обработчиков.

Однако производительность системы может пострадать, поскольку это может вызвать проблемы с отладкой или вызовы циклов. Кроме того, характеристики операций трудно наблюдать, поэтому поддержка этого кода будет более сложной.

Код доступен в проекте Github.

Есть еще 11 шаблонов проектирования поведения:

  1. Шаблон проектирования команд
  2. Шаблон проектирования интерпретатора
  3. Шаблон проектирования итератора
  4. Шаблон проектирования посредника
  5. Шаблон дизайна Memento
  6. Шаблон проектирования "Нулевой объект"
  7. Шаблон проектирования Observer
  8. Шаблон проектирования состояния
  9. Шаблон разработки стратегии
  10. Шаблон проектирования метода шаблона
  11. Шаблон проектирования посетителей