Команда (шаблон проєктування)
Загальний опис
Шаблон проєктування Команда відноситься до класу шаблонів поведінки. Він забезпечує механізм інкапсуляції запиту, дозволяючи параметризувати клієнта незалежно від його функціоналу.
Шаблон Команда представлений трьома основними компонентами:
- Команда: Інтерфейс, що визначає контракт для виконання запитів.
- Конкретна команда: Клас, який реалізує інтерфейс Команди та виконує конкретні дії.
- Спостерігач: Об'єкт, який зберігає список команд і викликає їх для виконання.
Переваги
Шаблон Команда надає ряд переваг:
- Інкапсуляція запитів: Інкапсулює запити в об'єкти, що робить їх легкими для керування та відстеження.
- Параметризація клієнта: Дозволяє клієнтам виконувати різні операції без необхідності знати деталі їх реалізації.
- Гнучкість розширення: Спрощує додавання нових операцій без зміни існуючого коду.
- Транзакційність: Може використовуватися для реалізації транзакційного поведінки шляхом групування разом кількох команд і обробки їх як одну операцію.
- Відстеження та журналювання: Полегшує відстеження та журналювання виконаних операцій.
Застосування
Шаблон Команда застосовується в широкому спектрі сценаріїв, включаючи:
- Меню користувальницького інтерфейсу: Пункти меню можна представляти як команди, що інкапсулюють дії, які потрібно виконати при їх виборі.
- Історія скасування/повторення: Можна реалізувати за допомогою стека команд, що дозволяє користувачам відміняти та повторювати попередні дії.
- Масова обробка: Групи схожих або незалежних завдань можна представлення у вигляді команд і виконувати одночасно або послідовно.
- Синхронізовані операції: Можна використовувати для координації дій між кількома об'єктами або потоками виконання.
- Розподілені системи: Може бути використаний для розподілення команд до різних вузлів у розподіленій системі.
Альтернативні назви
Шаблон Команда також відомий як:
- Дія (англ. Action)
- Транзакція (англ. Transaction)
Приклад коду
Нижче наведено спрощений приклад коду на C#, що демонструє шаблон Команда:
// Інтерфейс команди
public interface ICommand
{
void Execute();
}
// Конкретна команда
public class TurnOnCommand : ICommand
{
private Light _light;
public TurnOnCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.TurnOn();
}
}
// Спостерігач
public class LightSwitch
{
private List<ICommand> _commands = new List<ICommand>();
public void AddCommand(ICommand command)
{
_commands.Add(command);
}
public void ExecuteCommands()
{
foreach (ICommand command in _commands)
{
command.Execute();
}
}
}
// Клієнтський код
public class Program
{
public static void Main()
{
LightSwitch lightSwitch = new LightSwitch();
ICommand turnOnCommand = new TurnOnCommand(new Light());
lightSwitch.AddCommand(turnOnCommand);
lightSwitch.ExecuteCommands();
}
}
Шаблон проєктування Команда є потужним інструментом для індивідуалізації та параметризації поведінки будь-якого об'єкта. Його універсальність робить його придатним для широкого спектру застосувань, що вимагають гнучкої та розширюваної обробки запитів.
Часті запитання
- Які основні компоненти шаблону Команда?
- Назвіть переваги використання шаблону Команда?
- Які типові сценарії застосування шаблону Команда?
- Як шаблон Команда пов'язаний з транзакціями?
- Якою є мета Спостерігача в шаблоні Команда?