Перейти к основному содержимому

Что это

Паттерн Цепочка обязанностей передаёт запрос по цепочке обработчиков. Каждый обработчик либо обрабатывает запрос, либо передаёт его следующему. Отправитель знает только первое звено — и никогда не знает, кто на самом деле решит задачу.


Пример: линия поддержки

Проблема попадает в чат-бот. То, что не может исправить бот, уходит в техподдержку; то, что не может исправить техподдержка, уходит к менеджеру, который обрабатывает всё, что до него доходит.

Передавайте дальше, пока кто-нибудь не справится

Проблема «no internet» проходит один шаг и останавливается на tech support; запрос «refund request» проходит всю цепочку до manager. Вызывающий код в обоих случаях написал одну и ту же строку. Nullsafe-вызов $this->next?->handle() просто останавливается в конце цепочки.

Prompt
Напишите PHP-скрипт с цепочкой обязанностей: класс Handler с именем, замыканием canFix и обнуляемым следующим обработчиком. Постройте цепочку поддержки из chat bot, tech support и manager (который исправляет всё). Отправьте одну проблему, которую может решить среднее звено, и одну, которая доходит до manager, печатая каждый шаг.
Вывод: PHP-скрипт
Pass it on until someone can

Когда применять

Применяйте, когда запрос могут обработать несколько участников и заранее неизвестно, кто именно подходит, — эскалация в поддержке, middleware, обработка событий, процессы согласования.

Не применяйте, когда обработчик всегда известен, — вызывайте его напрямую. Цепочка из одного звена или цепочка, которая всегда заканчивается на одном и том же звене, — это обычный вызов функции в маскировке.


Плюсы и минусы

Плюсы: отправитель и получатели развязаны; звенья можно свободно добавлять, удалять и менять порядком; каждый обработчик остаётся небольшим.

Минусы: нет гарантии, что запрос кто-нибудь обработает — разорванная цепочка молча его теряет; отслеживание запроса через множество звеньев замедляет отладку.