Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Які класи зазвичай беруть участь у реалізації Command?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)У реалізації патерна **Command (Команда)** зазвичай бере участь **п'ять ключових класів (або ролей)**, які спільно забезпечують виконання, скасування і керування командами. **Ключове:** ця структура дозволяє **відокремити "що зробити" від "як зробити"**, роблячи систему гнучкою, розширюваною і легко керованою.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняУ реалізації патерна **Command (Команда)** зазвичай бере участь **п'ять ключових класів (або ролей)**, які спільно забезпечують виконання, скасування і керування командами. --- ### 1. **Command (Інтерфейс команди)** Визначає **єдиний контракт** для всіх команд - зазвичай включає методи: - `execute()` - виконати дію, - (опціонально) `undo()` - скасувати дію. **Приклад:** ```java interface Command { void execute(); void undo(); } ``` --- ### 2. **ConcreteCommand (Конкретна команда)** Реалізує інтерфейс `Command`, інкапсулює **конкретну дію** над об'єктом-отримувачем. Зберігає: - посилання на **Receiver**, - дані, необхідні для виконання і скасування. **Приклад:** ```java 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 (Отримувач)** Об'єкт, який **знає, як виконувати операцію**. Команда просто викликає його методи, не знаючи, *як саме* вони реалізовані. **Приклад:** ```java class Light { void turnOn() { System.out.println("Світло увімкнено"); } void turnOff() { System.out.println("Світло вимкнено"); } } ``` --- ### 4. **Invoker (Ініціатор)** Компонент, який **запускає команду**, але не знає, що вона робить. Він може зберігати команду, викликати `execute()` і `undo()`, а також керувати історією. **Приклад:** ```java 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 (Клієнт)** Створює команди, пов'язує їх з отримувачами і передає ініціатору. Він знає, які дії потрібно виконати, але не займається їхньою реалізацією. **Приклад:** ```java Light light = new Light(); Command turnOn = new TurnOnCommand(light); RemoteControl remote = new RemoteControl(); remote.setCommand(turnOn); remote.pressButton(); ``` --- ### 6. **Підсумкова структура** ```javascript Client ↓ Invoker → Command → Receiver ↑ ConcreteCommand ``` --- ### **Висновок** | Клас | Роль | |---|---| | **Command** | Визначає інтерфейс виконання (і скасування) дій | | **ConcreteCommand** | Зберігає посилання на отримувача і реалізує конкретну дію | | **Receiver** | Знає, *як* виконати операцію | | **Invoker** | Запускає команди, керує історією | | **Client** | Налаштовує зв'язки між командами і отримувачами | **Підсумок:** Ця структура дозволяє **відокремити "що зробити" від "як зробити"**, роблячи систему **гнучкою, розширюваною і легко керованою** - у тому числі для `undo/redo`, макросів і черг завдань.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.