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

Что это такое

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


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

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

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

Проблема «no internet» проходит один шаг и останавливается в техподдержке; запрос «refund request» проходит всю цепочку до менеджера. Вызывающий код оба раза написал одну и ту же строку.

Prompt
Напишите программу на Python с паттерном «Цепочка обязанностей»: dataclass Handler с именем (name), функцией can_fix и ссылкой next_handler. Постройте цепочку поддержки из чат-бота, техподдержки и менеджера (который решает всё). Отправьте одну проблему, которую может решить среднее звено, и одну, которая доходит до менеджера, выводя каждый шаг.
Вывод: полная программа на Python
Pass it on until someone can

Когда его использовать

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

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


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

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

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