Команда (шаблон проєктування)

Команда (англ. Command) — шаблон проєктування, відноситься до класу шаблонів поведінки. Також відомий як Дія (англ. Action), Транзакція (англ. Transaction).

Призначення ред.

Інкапсулює запит у формі об'єкта, дозволяючи тим самим задавати параметри клієнтів для обробки відповідних запитів, ставити запити у чергу або протоколювати їх, а також підтримувати скасовування операцій.

Мотивація ред.

Створення структури, в якій клас-відправник і клас-отримувач не залежать один від одного напряму. Організація зворотного виклику до класу, який містить у собі клас-відправник.

Застосовність ред.

Слід використовувати шаблон Команда коли:

  • треба параметризувати об'єкти дією. У процедурній мові таку параметризацію можна виразити за допомогою функції зворотнього виклику, тобто такою функцією, яка реєструється, щоби бути викликаною пізніше. Команди є об'єктно-орієнтованою альтернативою функціям зворотньогоо виклику;
  • визначати, ставити у чергу та виконувати запити у різний час. Термін життя об'єкта Команда не обов'язково залежить від терміну життя початкового запиту. Якщо отримувача вдається реалізувати таким чином, щоб він не залежав від адресного простору, то об'єкт-команду можна передати іншому процесу, який займеться його виконанням;
  • потрібна підтримка скасовування операцій. Операція Execute об'єкта Команда може зберегти стан, що необхідний для скасування дій, виконаних Командою. У цьому разі у інтерфейсі класу Command повинна бути додаткова операція Unexecute, котра скасовує дії, виконанні попереднім викликом операції Execute. Виконані команди зберігаються у списку історії. Для реалізації довільної кількості рівней скасування та повтору команд треба обходити цей список відповідно в зворотньому та прямому напрямках, викликаючи під час відвідування кожного елементу операцію Unexecute або Execute;
  • підтримати протоколювання змін, щоб їх можна було виконати повторно після аварійної зупинки системи. Доповнивши інтерфейс класу Command операціями зберігання та завантаження, можна вести протокол змін у внутрішній пам'яті. Для відновлення після збою треба буде завантажити збереженні команди з диску та повторно виконати їх за допомогою операції Execute;
  • треба структурувати систему на основі високорівневих операцій, що побудовані з примітивних. Така структура є типовою для інформаційних систем, що підтримують транзакції. Транзакція інкапсулює множину змін даних. Шаблон Команда дозволяє моделювати транзакції. В усіх команд є спільний інтерфейс, що надає можливість працювати однаково з будь-якими транзакціями. За допомогою цього шаблону можна легко додавати у систему нові види транзакцій.

Структура ред.

 
UML діаграма, що описує структуру шаблону проєктування Команда
  • Command — команда:
    • оголошує інтерфейс для виконання операції;
  • ConcreteCommand — конкретна команда:
    • визначає зв'язок між об'єктом-отримувачем Receiver та дією;
    • реалізує операцію Execute шляхом виклику відповідних операцій об'єкта Receiver;
  • Client — клієнт:
    • створює об'єкт класу ConcreteCommand та встановлює його отримувача;
  • Invoker — викликач:
    • звертається до команди щоб та виконала запит;
  • Receiver — отримувач:
    • має у своєму розпорядженні усю інформацію про способи виконання операцій, необхідних для задоволення запиту. У ролі отримувача може виступати будь-який клас.

Відносини ред.

 
UML діаграма, що описує взаємовідносини поміж об'єктів шаблону проєктування Команда
  • клієнт створює об'єкт ConcreteCommand та встановлює для нього отримувача;
  • викликач Invoker зберігає об'єкт ConcreteCommand;
  • викликач надсилає запит, викликаючи операцію команди Execute. Якщо підтримується скасування виконаних дій, то ConcreteCommand перед викликом Execute зберігає інформацію про стан, достатню для виконання скасування;
  • об'єкт ConcreteCommand викликає операції отримувача для виконання запиту

На діаграмі видно, як Command розриває зв'язок між викликачем та отримувачем (а також запитом, що повинен бути виконаний останнім).

Переваги ред.

  • Відокремлює класи, які викликають операцію від об'єкта, який вміє виконувати операцію
  • Дозволяє створювати послідовність команд за допомогою системи черги
  • Розширення для додавання нової команди є простими і можуть бути виконані без зміни існуючого коду
  • Ви також можете визначити систему відкату з командним шаблоном, наприклад, у прикладі майстра, ми можемо написати метод відкату

Недоліки ред.

  • Збільшення кількості класів для кожної окремої команди

Реалізація ред.

C++ ред.

C# ред.

Swift[1] ред.

Джерела ред.

Посилання ред.

  1. Design Patterns implemented in Swift 2. Архів оригіналу за 30 Січня 2016. Процитовано 10 Березня 2016.

Література ред.

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.