Які класи беруть участь у реалізації патерна?
У реалізації патерна State (Стан) беруть участь три основні класи (або ролі), які спільно забезпечують динамічну зміну поведінки об'єкта без умовних конструкцій.
1. Context (Контекст)
Об'єкт, поведінка якого залежить від стану. Він зберігає посилання на поточний об'єкт-стан і делегує йому виконання операцій.
Завдання Context:
- зберігає поточний стан (
State currentState), - передає виклики методам стану,
- може змінювати свій стан (через
setState()).
Приклад:
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()).
Приклад:
interface State {
void handleInput(Player context, String input);
}3. ConcreteState (Конкретні стани)
Кожен підклас реалізує поведінку, що відповідає певному стану. Він може:
- виконувати дії, характерні для цього стану;
- переводити контекст в інший стан (через
context.setState()).
Приклад:
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());
}
}
}Як вони взаємодіють
+----------------+
| Context |
|----------------|
| - state: State |
|----------------|
| + setState() |
| + handleInput()|
+----------------+
|
v
+----------------+
| State | <--- інтерфейс
+----------------+
^
|
+----------------+ +----------------+
| IdleState | | RunningState |
+----------------+ +----------------+Алгоритм роботи
- Контекст створюється з початковим станом.
- При дії користувача (
handleInputтощо) контекст викликає метод свого поточного стану. - Конкретний стан виконує потрібну логіку і, якщо потрібно, переводить контекст в інший стан.
- Контекст змінює посилання
state, і відтепер поводиться по-іншому.
Висновок
| Клас | Роль |
|---|---|
| Context | Зберігає поточний стан, делегує йому поведінку |
| State | Визначає інтерфейс усіх можливих станів |
| ConcreteState | Реалізує конкретну поведінку і керує переходами між станами |
Підсумок:
State працює тому, що контекст делегує всю поточну поведінку станам, а вони можуть динамічно замінювати один одного, змінюючи поведінку без
if-else.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.