Поведенческие паттерны
Поведенческие паттерны распределяют алгоритм и обмен сообщениями между объектами. Главный вопрос раздела: кто управляет следующим шагом.
Карта выбора
| Ситуация | Паттерн | Где хранится управление |
|---|---|---|
| Нужен скрытый или альтернативный обход структуры | Итератор 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 обычно уведомляет всех зарегистрированных подписчиков; их отсутствие не означает необработанный запрос.
Вопросы к поведению
- Кто инициирует операцию?
- Кто решает, что будет следующим шагом?
- Может ли операция остановиться досрочно?
- Что происходит, если получатель отсутствует?
- Важен ли порядок участников?
- Где хранится изменяемое состояние алгоритма?
Типичные ошибки
- Iterator возвращает
nullвместоNoSuchElementException; - Template Method позволяет переопределить сам каркас и нарушить порядок;
- Chain молча теряет запрос в конце;
- обработчики Chain меняют общий контекст в неочевидном порядке;
- Observer выполняет медленных подписчиков синхронно без явного контракта;
- паттерн используется там, где достаточно обычного цикла или функции.
Маршрут повторения
- Реализовать свой
Iterator<T>и объяснить fail-fast. - Переписать дублирующийся алгоритм через Template Method, затем сравнить со Strategy.
- Собрать Chain в двух режимах: «первый подходящий» и «все проверки».
- Сравнить обработку ошибки, пустого результата и досрочной остановки.
Навигация: Шаблоны проектирования, Паттерны, Принципы SOLID.