Чим State відрізняється від Strategy?
Патерни State (Стан) і Strategy (Стратегія) зовні дуже схожі: в обох поведінка об'єкта делегується окремим класам, що реалізують спільний інтерфейс. Але їхні цілі й контексти застосування принципово різні.
1. Головна ідея
| Критерій | State | Strategy |
|---|---|---|
| Що змінюється | Поведінка об'єкта залежно від його стану | Алгоритм, який використовує об'єкт залежно від вибору клієнта |
| Хто обирає | Сам об'єкт (внутрішня логіка) | Клієнт (зовнішній код) |
| Мета | Спростити перемикання станів і усунути if-else | Інкапсулювати різні алгоритми і зробити їх взаємозамінними |
| Зміна поведінки | Автоматична (за внутрішніми переходами) | Явна (за рішенням користувача чи коду) |
2. Механізм
State
Об'єкт сам зберігає посилання на поточний стан і сам перемикає його, коли змінюється його внутрішній стан.
Контекст керує собою: "Я в стані X, тепер повинен перейти в Y".
class Context {
private State state;
public void setState(State s) { this.state = s; }
public void request() { state.handle(this); }
}Стани можуть змінювати контекст:
class ConcreteStateA implements State {
public void handle(Context c) { c.setState(new ConcreteStateB()); }
}Strategy
Контекст отримує стратегію ззовні і не керує нею. Вибір алгоритму робить клієнт - вручну.
Клієнт вирішує: "Використовуй стратегію сортування за зростанням."
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. Аналогія
| Ситуація | State | Strategy |
|---|---|---|
| Кавомашина | Автоматично перемикається з "очікування" в "налив кави" і назад | Користувач обирає, яку каву заварити |
| Гравець у грі | Сам переходить зі стану "живий" → "поранений" → "мертвий" | Користувач сам вирішує, якою зброєю атакувати |
5. Ключові відмінності в одному реченні
- State - керує внутрішніми переходами поведінки об'єкта.
- Strategy - надає зовнішній вибір алгоритму поведінки.
Висновок
Обидва патерни використовують делегування й інтерфейси, але:
- State моделює динамічну зміну поведінки за станом;
- Strategy - гнучкий вибір алгоритму ззовні.
Підсумок:
State - об'єкт живе і сам змінюється в часі. Strategy - об'єкт використовує обраний спосіб дії.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.