Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить патерн Command і навіщо він потрібен?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Command (Команда)** - це **поведінковий патерн**, який перетворює **запит або дію на окремий об'єкт**, що інкапсулює всю інформацію, необхідну для його виконання. **Ключове:** такий об'єкт можна **передавати, ставити в чергу, скасовувати або повторювати** - усе без знання того, як саме виконується операція.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Command (Команда)** - це **поведінковий патерн**, який перетворює **запит або дію на окремий об'єкт**, що інкапсулює всю інформацію, необхідну для його виконання. --- ### 1. **Суть ідеї** Замість того щоб викликати методи напряму, програма створює об'єкт-команду, який зберігає: - посилання на отримувача (об'єкт, який виконає дію), - саму дію, - і необхідні параметри. Такий об'єкт можна **передавати, ставити в чергу, скасовувати або повторювати** - усе без знання того, як саме виконується операція. > **Ідея:** "упакувати дію в об'єкт". --- ### 2. **Навіщо потрібен** - Щоб **відокремити запит від його виконавця**. - Щоб можна було **відкласти виконання**, **поставити в чергу** або **скасувати** дію. - Щоб реалізувати **історію операцій**, макроси, "undo/redo", транзакції. --- ### 3. **Структура** - **Command** - інтерфейс з методом `execute()`. - **ConcreteCommand** - конкретна команда, викликає потрібний метод у отримувача. - **Receiver** - об'єкт, який знає, як виконати дію. - **Invoker** - ініціатор, який викликає команду (наприклад, кнопка). - **Client** - створює команду і передає її ініціатору. --- ### 4. **Приклад (Java)** ```java interface Command { void execute(); } class Light { void turnOn() { System.out.println("Світло увімкнено"); } void turnOff() { System.out.println("Світло вимкнено"); } } class TurnOnCommand implements Command { private Light light; public TurnOnCommand(Light light) { this.light = light; } public void execute() { light.turnOn(); } } class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); } } // Використання Light light = new Light(); Command on = new TurnOnCommand(light); RemoteControl remote = new RemoteControl(); remote.setCommand(on); remote.pressButton(); ``` --- ### 5. **Переваги** - Дозволяє **відокремити клієнта від логіки виконання**. - Підтримує **черги, історію, undo/redo**. - Спрощує додавання нових команд без зміни наявного коду. - Підходить для **GUI-кнопок, меню, планувальників завдань**. --- ### **Висновок** **Command** потрібен, щоб представити дію у вигляді **об'єкта**, який можна **виконувати, скасовувати, логувати і комбінувати**, роблячи тим самим систему **гнучкою, розширюваною і керованою в часі**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.