Skip to content

Chain of Responsibility

Pandas edited this page Jun 18, 2017 · 1 revision

Назначение

Позволяет избежать привязки отправителя запроса к его получателю, давая шанс обработать запрос нескольким объектам. Связывает объекты-получатели в цепочку и передает запрос вдоль этой цепочки, пока его не обработают.

Применимость

Используйте цепочку обязанностей, когда:

  • Есть более одного объекта, способного обработать запрос, причем настоящий обработчик заранее неизвестен и должен быть найден автоматически;
  • Вы хотите отправить запрос одному из нескольких объектов, не указывая явно, какому именно;
  • Набор объектов, способных обработать запрос, должен задаваться динамически.

Структура

Imgur

Участники

  • Handler - обработчик: определяет интерфейс для обработки запросов; (необязательно) реализует связь с преемником;
  • ConcreteHandler - конкретный обработчик: обрабатывает запрос, за который отвечает; имеет доступ к своему преемнику; если ConcreteHandler способен обработать запрос, то так и делает, если не может, то направляет его - его своему преемнику;
  • Client - клиент: отправляет запрос некоторому объекту ConcreteHandler в цепочке.

Результаты

Паттерн цепочка обязанностей имеет следующие достоинства и недостатки:

  • Ослабление связанности. Этот паттерн освобождает объект от необходимости «знать», кто конкретно обработает его запрос. Отправителю и получателю ничего неизвестно друг о друге, а включенному в цепочку объекту - о структуре цепочки. Таким образом, цепочка обязанностей помогает упростить взаимосвязи
  • Дополнительная гибкость при распределении обязанностей между объектами.
  • Получение не гарантировано. Поскольку у запроса нет явного получателя, то нет и гарантий, что он вообще будет обработан.
Clone this wiki locally