Chain of Responsibility и обзор остальных
Паттерн цепочки обработчиков плюс быстрый обзор оставшихся поведенческих паттернов: Mediator, Memento, Visitor.
Chain of Responsibility передаёт запрос по цепочке обработчиков, пока один из них не обработает его, развязывая отправителя и получателей.
Chain of Responsibility
Запрос должны проверить несколько обработчиков: аутентификация, лимит, валидация. Жёстко связать их в один метод — негибко. Chain of Responsibility выстраивает обработчиков в цепочку: каждый либо обрабатывает запрос, либо передаёт следующему. Добавить/переставить звено — не трогая остальные.
class Handler:
def __init__(self, nxt=None):
self.nxt = nxt
def handle(self, level, msg):
if self.nxt:
self.nxt.handle(level, msg)
class InfoHandler(Handler):
def handle(self, level, msg):
if level == "info":
print(f"INFO: {msg}")
else:
super().handle(level, msg)
class ErrorHandler(Handler):
def handle(self, level, msg):
if level == "error":
print(f"ERROR: {msg}")
else:
super().handle(level, msg)
# цепочка: info -> error
chain = InfoHandler(ErrorHandler())
chain.handle("info", "запуск")
chain.handle("error", "сбой диска")
Вывод:
INFO: запуск ERROR: сбой диска
Каждый обработчик решает: «моё?» — обработать, иначе передать дальше через super().handle. Отправитель знает только начало цепочки. Это основа middleware: каждый слой что-то делает с запросом и пускает дальше.
Краткий обзор оставшихся
| Паттерн | Идея в одном предложении | Где |
| Mediator | Объекты общаются не напрямую, а через посредника, снижая связанность «многие ко многим» | Чаты, диалоги UI, координаторы |
| Memento | Сохраняет снимок состояния объекта, чтобы позже восстановить, не раскрывая его внутренности | Undo, чекпойнты, снапшоты |
| Visitor | Выносит операцию в отдельный объект-посетитель, добавляя действия над структурой без изменения её классов | Обход AST, отчёты по дереву |
Эти три встречаются реже, но знать их полезно. Mediator часто путают с Facade: фасад упрощает доступ к подсистеме, а медиатор координирует взаимные связи равноправных объектов. Memento — частый напарник Command для реализации undo. Visitor мощен, но громоздок: его берут, когда операций над фиксированной структурой много и они часто добавляются.
Где встречается Chain
Middleware веб-фреймворков (Django/Express), пайплайны обработки событий, фильтры/перехватчики, обработка исключений, конвейеры валидации.
Итог
- Chain of Responsibility пропускает запрос по цепочке обработчиков.
- Развязывает отправителя и получателей — основа middleware.
- Mediator — посредник, Memento — снимок состояния, Visitor — операция-посетитель.