Які класи зазвичай беруть участь у реалізації Command?
У реалізації патерна Command (Команда) зазвичай бере участь п'ять ключових класів (або ролей), які спільно забезпечують виконання, скасування і керування командами.
1. Command (Інтерфейс команди)
Визначає єдиний контракт для всіх команд - зазвичай включає методи:
execute()- виконати дію,- (опціонально)
undo()- скасувати дію.
Приклад:
interface Command {
void execute();
void undo();
}2. ConcreteCommand (Конкретна команда)
Реалізує інтерфейс Command, інкапсулює конкретну дію над об'єктом-отримувачем.
Зберігає:
- посилання на Receiver,
- дані, необхідні для виконання і скасування.
Приклад:
class TurnOnCommand implements Command {
private Light light;
public TurnOnCommand(Light light) { this.light = light; }
public void execute() { light.turnOn(); }
public void undo() { light.turnOff(); }
}3. Receiver (Отримувач)
Об'єкт, який знає, як виконувати операцію. Команда просто викликає його методи, не знаючи, як саме вони реалізовані.
Приклад:
class Light {
void turnOn() { System.out.println("Світло увімкнено"); }
void turnOff() { System.out.println("Світло вимкнено"); }
}4. Invoker (Ініціатор)
Компонент, який запускає команду, але не знає, що вона робить.
Він може зберігати команду, викликати execute() і undo(), а також керувати історією.
Приклад:
class RemoteControl {
private Command command;
public void setCommand(Command command) { this.command = command; }
public void pressButton() { command.execute(); }
public void pressUndo() { command.undo(); }
}5. Client (Клієнт)
Створює команди, пов'язує їх з отримувачами і передає ініціатору. Він знає, які дії потрібно виконати, але не займається їхньою реалізацією.
Приклад:
Light light = new Light();
Command turnOn = new TurnOnCommand(light);
RemoteControl remote = new RemoteControl();
remote.setCommand(turnOn);
remote.pressButton();6. Підсумкова структура
Client
↓
Invoker → Command → Receiver
↑
ConcreteCommandВисновок
| Клас | Роль |
|---|---|
| Command | Визначає інтерфейс виконання (і скасування) дій |
| ConcreteCommand | Зберігає посилання на отримувача і реалізує конкретну дію |
| Receiver | Знає, як виконати операцію |
| Invoker | Запускає команди, керує історією |
| Client | Налаштовує зв'язки між командами і отримувачами |
Підсумок:
Ця структура дозволяє відокремити "що зробити" від "як зробити",
роблячи систему гнучкою, розширюваною і легко керованою - у тому числі для undo/redo, макросів і черг завдань.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.