PassFront
  1. PassFront
  2. База знаний
  3. Поведенческие паттерны

Чем Strategy отличается от State и Template Method?

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

Strategy выбирает алгоритм из взаимозаменяемого семейства, и его передаёт контексту клиент; State переключает поведение объекта сам, по мере смены внутреннего состояния — структура одинаковая, разница в том, кто и зачем меняет реализацию.

Strategy

Контекст хранит ссылку на стратегию: sort(data, comparator). Клиент выбирает алгоритм, стратегии не знают друг о друге. В языках с функциями первого класса стратегия — просто функция, классы не нужны.

State

Объект-заказ делегирует pay() и ship() текущему состоянию; состояния сами переводят заказ дальше: Paid → Shipped. Состояния знают о переходах — это конечный автомат, инкапсулированный по классам.

Template Method — иной подход к вариативности

Скелет алгоритма зафиксирован в базовом классе, отдельные шаги переопределяют подклассы: вариативность через наследование на этапе компиляции, тогда как Strategy — через композицию в рантайме.

Коротко для собеседования

Strategy и State устроены одинаково — контекст делегирует объекту поведения, — но стратегию выбирает клиент, а состояние меняется само по ходу жизни объекта. Template Method решает ту же задачу наследованием; в JS стратегия чаще всего просто функция, а при двух ветках хватит if.

Другие вопросы раздела