Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чим State відрізняється від Strategy?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Патерни **State (Стан)** і **Strategy (Стратегія)** зовні дуже схожі: в обох поведінка об'єкта делегується окремим класам, що реалізують спільний інтерфейс. Але **їхні цілі й контексти застосування принципово різні**. **Ключове:** State - об'єкт *живе і сам змінюється в часі*, а Strategy - об'єкт *використовує обраний спосіб дії*.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняПатерни **State (Стан)** і **Strategy (Стратегія)** зовні дуже схожі: в обох поведінка об'єкта делегується окремим класам, що реалізують спільний інтерфейс. Але **їхні цілі й контексти застосування принципово різні**. --- ### 1. **Головна ідея** | Критерій | **State** | **Strategy** | |---|---|---| | Що змінюється | Поведінка об'єкта **залежно від його стану** | Алгоритм, який використовує об'єкт **залежно від вибору клієнта** | | Хто обирає | Сам об'єкт (внутрішня логіка) | Клієнт (зовнішній код) | | Мета | Спростити перемикання станів і усунути `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. **Аналогія** | Ситуація | State | Strategy | |---|---|---| | Кавомашина | Автоматично перемикається з "очікування" в "налив кави" і назад | Користувач обирає, *яку каву заварити* | | Гравець у грі | Сам переходить зі стану "живий" → "поранений" → "мертвий" | Користувач сам вирішує, *якою зброєю атакувати* | --- ### 5. **Ключові відмінності в одному реченні** - **State** - керує **внутрішніми переходами** поведінки об'єкта. - **Strategy** - надає **зовнішній вибір** алгоритму поведінки. --- ### **Висновок** Обидва патерни використовують делегування й інтерфейси, але: - **State** моделює *динамічну зміну поведінки за станом*; - **Strategy** - *гнучкий вибір алгоритму ззовні*. **Підсумок:** > **State** - об'єкт *живе і сам змінюється в часі*. > **Strategy** - об'єкт *використовує обраний спосіб дії*.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.