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 — операция-посетитель.
Проверьте себя
1. Как работает Chain of Responsibility?
AВсе обработчики вызываются всегда
BЗапрос обрабатывает синглтон
CЗапрос идёт по цепочке, пока кто-то его не обработает
DЗапрос копируется каждому
2. Что делает Memento?
AСоздаёт семейство объектов
BАдаптирует интерфейс
CПередаёт запрос по цепочке
DСохраняет снимок состояния для последующего восстановления
3. Чем Mediator отличается от Facade?
AFacade упрощает доступ к подсистеме, Mediator координирует взаимные связи равноправных объектов
BНичем
CMediator всегда один объект
DFacade передаёт запросы по цепочке