Поведенческие паттерны

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

Карта выбора

СитуацияПаттернГде хранится управление
Нужен скрытый или альтернативный обход структурыИтератор IteratorВ объекте-курсоре
Каркас алгоритма стабилен, шаги меняютсяШаблонный метод Template MethodВ базовом классе
Получатель выбирается последовательным проходомЦепочка обязанностей Chain of ResponsibilityВ связях обработчиков
Несколько получателей реагируют на событиеObserverВ списке подписок издателя
Алгоритм заменяется целикомСтратегия StrategyВ отдельном объекте или функции

Как различать

Iterator и Chain of Responsibility

Iterator возвращает элементы структуры клиенту. Chain передаёт один запрос между обработчиками и может остановиться на любом из них.

Template Method и Strategy

Template Method фиксирует порядок наследованием и разрешает переопределить отдельные шаги. Strategy передаёт весь вариант алгоритма отдельным объектом. Strategy проще подменять во время выполнения; Template Method удобен для стабильного каркаса с небольшим числом hooks.

Chain и Observer

В Chain порядок определяет возможного единственного получателя или конвейер. Observer обычно уведомляет всех зарегистрированных подписчиков; их отсутствие не означает необработанный запрос.

Вопросы к поведению

  1. Кто инициирует операцию?
  2. Кто решает, что будет следующим шагом?
  3. Может ли операция остановиться досрочно?
  4. Что происходит, если получатель отсутствует?
  5. Важен ли порядок участников?
  6. Где хранится изменяемое состояние алгоритма?

Типичные ошибки

  • Iterator возвращает null вместо NoSuchElementException;
  • Template Method позволяет переопределить сам каркас и нарушить порядок;
  • Chain молча теряет запрос в конце;
  • обработчики Chain меняют общий контекст в неочевидном порядке;
  • Observer выполняет медленных подписчиков синхронно без явного контракта;
  • паттерн используется там, где достаточно обычного цикла или функции.

Маршрут повторения

  • Реализовать свой Iterator<T> и объяснить fail-fast.
  • Переписать дублирующийся алгоритм через Template Method, затем сравнить со Strategy.
  • Собрать Chain в двух режимах: «первый подходящий» и «все проверки».
  • Сравнить обработку ошибки, пустого результата и досрочной остановки.

Навигация: Шаблоны проектирования, Паттерны, Принципы SOLID.