Команда (шаблон проектування)
Матеріал з Вікіпедії — вільної енциклопедії.
Команда (англ. 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 розриває зв'язок між викликачем та отримувачем (а також запитом, що повинен бути виконаний останнім).
[ред.] Джерела
- Design Patterns: Elements of Reusable Object-Oriented Software