Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Які класи беруть участь у реалізації патерна?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)У реалізації патерна **State (Стан)** беруть участь **три основні класи (або ролі)**, які спільно забезпечують динамічну зміну поведінки об'єкта без умовних конструкцій. **Ключове:** State працює тому, що контекст делегує всю поточну поведінку станам, а вони можуть динамічно замінювати один одного, змінюючи поведінку без `if-else`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняУ реалізації патерна **State (Стан)** беруть участь **три основні класи (або ролі)**, які спільно забезпечують динамічну зміну поведінки об'єкта без умовних конструкцій. --- ### 1. **Context (Контекст)** Об'єкт, поведінка якого **залежить від стану**. Він зберігає посилання на поточний об'єкт-стан і делегує йому виконання операцій. **Завдання Context:** - зберігає поточний стан (`State currentState`), - передає виклики методам стану, - може змінювати свій стан (через `setState()`). **Приклад:** ```java class Player { private State state; public Player() { this.state = new IdleState(); } public void setState(State state) { this.state = state; } public void handleInput(String input) { state.handleInput(this, input); } } ``` --- ### 2. **State (Інтерфейс стану)** Визначає загальний інтерфейс, який повинні реалізовувати всі конкретні стани. Кожен стан описує поведінку контексту в даному стані. **Завдання State:** - оголошує методи, які контекст викликає за певних дій, - задає контракт для всіх станів (наприклад, `handleInput()`, `update()`, `enter()`, `exit()`). **Приклад:** ```java interface State { void handleInput(Player context, String input); } ``` --- ### 3. **ConcreteState (Конкретні стани)** Кожен підклас реалізує поведінку, що відповідає певному стану. Він може: - виконувати дії, характерні для цього стану; - **переводити контекст** в інший стан (через `context.setState()`). **Приклад:** ```java class IdleState implements State { public void handleInput(Player context, String input) { if (input.equals("PRESS")) { System.out.println("Перехід у стан Бігу"); context.setState(new RunningState()); } } } class RunningState implements State { public void handleInput(Player context, String input) { if (input.equals("STOP")) { System.out.println("Перехід у стан Очікування"); context.setState(new IdleState()); } } } ``` --- ### **Як вони взаємодіють** ```javascript +----------------+ | Context | |----------------| | - state: State | |----------------| | + setState() | | + handleInput()| +----------------+ | v +----------------+ | State | <--- інтерфейс +----------------+ ^ | +----------------+ +----------------+ | IdleState | | RunningState | +----------------+ +----------------+ ``` --- ### **Алгоритм роботи** 1. **Контекст** створюється з початковим станом. 2. При дії користувача (`handleInput` тощо) контекст викликає метод свого поточного стану. 3. **Конкретний стан** виконує потрібну логіку і, якщо потрібно, переводить контекст в інший стан. 4. Контекст змінює посилання `state`, і відтепер поводиться по-іншому. --- ### **Висновок** | Клас | Роль | |---|---| | **Context** | Зберігає поточний стан, делегує йому поведінку | | **State** | Визначає інтерфейс усіх можливих станів | | **ConcreteState** | Реалізує конкретну поведінку і керує переходами між станами | **Підсумок:** > State працює тому, що **контекст делегує всю поточну поведінку станам**, > а вони можуть **динамічно замінювати один одного**, змінюючи поведінку без `if-else`.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.