Можно избежать жесткой зависимости отправителя запроса от его получателя, при этом зпросом начинает обрабатываться один из нескольких объектов. Объекты-получатели связывают в цепочку, и запрос передается по цепочке, пока какой-то объект его не обработает.
Назначение
Позволяет избежать привязки отправителя запроса к его получателю, давая шанс обработать запрос нескольким объекта. Связывает объекты-получатели в цепочку и передает запрос вдоль этой цепочки, пока его не обработают.
Применимость
Используйте цепочку обязанностей, когда:
- есть более одного объекта, способного обработать запрос, причем настоящий обработчик заранее неизвестен и должен быть найден автоматически;
- вы хотите отправить запрос одному из нескольких объектов, не указывая явно, какому именно;
- набор объектов, способных обработать запрос, должен задаватся динамически.
Структура
Участники
- Handler - обработчик:
- определяет интерфейс для обработки запросов;
- (необязательно) реализует связь с приемником;
- ConcreteHandler - конкретный обработчик:
- обрабатывает запрос за который отвечает;
- имеет доступ к своему приемнику;
- если ConcreteHandler способен обработать запрос, то так и делает, если не может, то направляет его своему приемнику;
- Client - клиент - отправляет запрос некоторому объекту ConcreteHandler в цепочке.
Результаты
- ослабление связанности. Этот паттерн освобождает объект от необходимости "знать" кто конкретно обработает его запрос. Отправителю и получателю ничего не известно друг о друге, а включенному в цепочку объекту - о структуре цепочки. Вместо того, чтобы хранить ссылки на все объекты, которые могут стать получателями запроса, объект должен располагать информацией лишь о своем преемнике;
- дополнительная гибкость при распределении обязанностей между объектами. Цепочка обязанностей позволяет повысить гибкость распределения обязанностей между объектами.Добавить или изменить обязанности по обработке запроса можно, включив в цепочку новых участников или изменив ее каким-то другим образом. Этот подход можно сочетать со статическим порождением подклассов для создания специализированных обработчиков;
- получение не гарантировано. Поскольку у запроса нет явного получателя, то нет и гарантий, что он вообще будет обработан: он может достичь конца цепочки и пропасть. Необработанным запрос может оказаться и в случае неправильной конфигурации цепочки.