State и Strategy структурно почти одинаковы. Что их различает?
Кто управляет подстановкой: стратегию выбирает клиент снаружи, и она обычно не меняется; состояние объект меняет сам в ответ на события, и переходы — часть его логики.
- State: заказ «новый → оплачен → отправлен», у каждой фазы своё поведение
- State заменяет разросшиеся switch по статусу
- В современной Java — enum с методами или sealed-иерархия
А ещё Для сложных процессов — машина состояний (Spring Statemachine)
Подробно
Оба делегируют работу подставляемому объекту, поэтому по структуре неразличимы. Разница в намерении: стратегия — взаимозаменяемый алгоритм, выбранный снаружи; состояние — фаза жизненного цикла, и переходы между фазами составляют часть логики самого объекта. Практическое применение State — рабочие процессы со статусами (заказ: новый → оплачен → отгружен), где иначе получается разбухающий switch по статусу в каждом методе.
Что хотят услышать
- Различие по намерению и управлению.
- Пример State.
Частые ошибки
- Пытаться развести паттерны по механизму — он у них общий.
- Реализовывать State там, где хватает enum со статусом и пары проверок.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Стратегию выбирает клиент; состояние объект меняет сам при переходах
- ✗Strategy требует интерфейса, а State — абстрактного класса с общими полями
- ✗State использует наследование, а Strategy — композицию
- ✗State применим только к иммутабельным объектам
Что спросят дальше
- Как State помогает избавиться от switch по статусу?
- Где здесь проходит граница с конечным автоматом?
Разбор темы
- Поведенческие паттерны
Strategy, Template Method, Observer, Command, Chain of Responsibility, State, Iterator и Visitor — с примерами из JDK, Spring и заменой паттернов лямбдами и sealed-типами.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.