printПаттерны поведения

printКоманда

Command

Назначение
Инкапсулирует запрос как объект, позволяя тем самым задавать параметры клиентов для обработки соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций.

Результаты
1. Команда разрывает связь между объектом, инициирующим операцию, и объектом, имеющим информацию о том, как ее выполнить.
2. Команды – это самые настоящие объекты. Допускается манипулировать ими и расширять их точно так же, как в случае с любыми другими объектами.
3. Из простых команд можно собирать составные, например, макрокоманды, при реализации которых можно использовать паттерн компоновщик.
4. Добавлять новые команды легко, поскольку никакие существующие классы изменять не нужно.

Реализация
// Команда объявляет интерфейс для выполнения операции
class Command {
public:
  virtual void Execute()=0;
};
// Получатель располагает информацией о способах выполнения операций
// Например, получателем может быть Окно, а операцией -  закрытие окна
class Receiver { 
public:
  void Action();  
};
// Конкретная команда определяет связь между объектом-получателем и действием
class Command1 : public Command {
  Receiver *r;
public:
  Command1(Receiver *r):r(r) {}
  void Execute() { r->Action(); }
};
// Инициатор обращается к команде для выполнения запроса
// Например, инициатором может Кнопка, при нажатии на которую выполнится заданная команда
class Invoker {
  Command *cmd;
public:
  void AddCommand(Command *c) { cmd=c; }
  void Action() { cmd->execute(); }
};
// Использование
Invoker inv;
Receiver rec;
inv.AddCommand(new Command1(&rec));
...
inv.Action();
loading