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?
AНичем
BFacade упрощает доступ к подсистеме, Mediator координирует взаимные связи равноправных объектов
CMediator всегда один объект
DFacade передаёт запросы по цепочке
Поддержать проект