Skip to main content

Чим State відрізняється від Strategy?

Патерни State (Стан) і Strategy (Стратегія) зовні дуже схожі: в обох поведінка об'єкта делегується окремим класам, що реалізують спільний інтерфейс. Але їхні цілі й контексти застосування принципово різні.


1. Головна ідея

КритерійStateStrategy
Що змінюєтьсяПоведінка об'єкта залежно від його стануАлгоритм, який використовує об'єкт залежно від вибору клієнта
Хто обираєСам об'єкт (внутрішня логіка)Клієнт (зовнішній код)
МетаСпростити перемикання станів і усунути if-elseІнкапсулювати різні алгоритми і зробити їх взаємозамінними
Зміна поведінкиАвтоматична (за внутрішніми переходами)Явна (за рішенням користувача чи коду)

2. Механізм

State

Об'єкт сам зберігає посилання на поточний стан і сам перемикає його, коли змінюється його внутрішній стан.

Контекст керує собою: "Я в стані X, тепер повинен перейти в Y".

java
class Context { private State state; public void setState(State s) { this.state = s; } public void request() { state.handle(this); } }

Стани можуть змінювати контекст:

java
class ConcreteStateA implements State { public void handle(Context c) { c.setState(new ConcreteStateB()); } }

Strategy

Контекст отримує стратегію ззовні і не керує нею. Вибір алгоритму робить клієнт - вручну.

Клієнт вирішує: "Використовуй стратегію сортування за зростанням."

java
class Context { private Strategy strategy; public Context(Strategy s) { this.strategy = s; } public void execute() { strategy.doAlgorithm(); } }

3. Приклад різниці

State: банкомат

  • Стани: Без картки, З карткою, Немає грошей.
  • ATM сам перемикає стани залежно від дій користувача.
  • Клієнт не керує станами напряму.

Поведінка змінюється автоматично за внутрішньою логікою.


Strategy: стиснення файлів

  • Стратегії: ZIP, RAR, 7Z.
  • Клієнт обирає потрібну стратегію перед виконанням.

Поведінка змінюється за вибором користувача.


4. Аналогія

СитуаціяStateStrategy
КавомашинаАвтоматично перемикається з "очікування" в "налив кави" і назадКористувач обирає, яку каву заварити
Гравець у гріСам переходить зі стану "живий" → "поранений" → "мертвий"Користувач сам вирішує, якою зброєю атакувати

5. Ключові відмінності в одному реченні

  • State - керує внутрішніми переходами поведінки об'єкта.
  • Strategy - надає зовнішній вибір алгоритму поведінки.

Висновок

Обидва патерни використовують делегування й інтерфейси, але:

  • State моделює динамічну зміну поведінки за станом;
  • Strategy - гнучкий вибір алгоритму ззовні.

Підсумок:

State - об'єкт живе і сам змінюється в часі. Strategy - об'єкт використовує обраний спосіб дії.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.