Получить доступ

State и Strategy структурно почти одинаковы. Что их различает?

MiddleПаттерны проектирования
Коротко

Кто управляет подстановкой: стратегию выбирает клиент снаружи, и она обычно не меняется; состояние объект меняет сам в ответ на события, и переходы — часть его логики.

  • State: заказ «новый → оплачен → отправлен», у каждой фазы своё поведение
  • State заменяет разросшиеся switch по статусу
  • В современной Java — enum с методами или sealed-иерархия

А ещё Для сложных процессов — машина состояний (Spring Statemachine)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Оба делегируют работу подставляемому объекту, поэтому по структуре неразличимы. Разница в намерении: стратегия — взаимозаменяемый алгоритм, выбранный снаружи; состояние — фаза жизненного цикла, и переходы между фазами составляют часть логики самого объекта. Практическое применение State — рабочие процессы со статусами (заказ: новый → оплачен → отгружен), где иначе получается разбухающий switch по статусу в каждом методе.

Что хотят услышать

  • Различие по намерению и управлению.
  • Пример State.

Частые ошибки

  • Пытаться развести паттерны по механизму — он у них общий.
  • Реализовывать State там, где хватает enum со статусом и пары проверок.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Стратегию выбирает клиент и она обычно не меняется по ходу; состояние объект меняет сам в ответ на события, и переходы — часть логики
  • ✗State использует наследование, а Strategy — композицию
  • ✗State применим только к иммутабельным объектам
  • ✗Strategy требует интерфейса, а State — абстрактного класса

Что спросят дальше

  • Как State помогает избавиться от switch по статусу?
  • Где здесь проходит граница с конечным автоматом?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем