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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Команда (англ. 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.