Команда (Command) :: Cетевой уголок Majestio

Команда (Command)


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

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#include <iostream>
#include <vector>

// Интерфейс команды

class Command {
 public:
  virtual void execute() = 0;
};

// Конкретная команда 1

class ConcreteCommand1 : public Command {
 private:
  std::string action;

 public:
  ConcreteCommand1(const std::string& action) : action(action) {}

  void execute() override {
    std::cout << "Выполняется команда 1: " << action << std::endl;
    // Здесь можно добавить логику выполнения команды 1
  }
};

// Конкретная команда 2

class ConcreteCommand2 : public Command {
 private:
  std::string action;

 public:
  ConcreteCommand2(const std::string& action) : action(action) {}

  void execute() override {
    std::cout << "Выполняется команда 2: " << action << std::endl;
    // Здесь можно добавить логику выполнения команды 2
  }
};

// Инициатор

class Invoker {
 private:
  std::vector<Command*> commands;

 public:
  void addCommand(Command* command) { commands.push_back(command); }

  void executeCommands() {
    for (Command* command : commands) {
      command->execute();
    }
  }
};

int main() {
  Invoker invoker;

  // Создание команд и добавление их в инициатор
  Command* command1 = new ConcreteCommand1("Построить кузов");
  Command* command2 = new ConcreteCommand2("Установить двигатель");
  invoker.addCommand(command1);
  invoker.addCommand(command2);

  // Выполнение команд
  invoker.executeCommands();

  // Освобождение ресурсов
  delete command1;
  delete command2;

  return 0;
}
Будет напечатано:
Выполняется команда 1: Построить кузов
Выполняется команда 2: Установить двигатель
abstract class Command {
  void execute();
}

class ConcreteCommand1 implements Command {
  final String action;

  ConcreteCommand1(this.action);

  void execute() {
    print('Выполняется команда 1: $action');
    // Здесь можно добавить логику выполнения команды 1
  }
}

class ConcreteCommand2 implements Command {
  final String action;

  ConcreteCommand2(this.action);

  void execute() {
    print('Выполняется команда 2: $action');
    // Здесь можно добавить логику выполнения команды 2
  }
}

class Invoker {
  final List<Command> commands = [];

  void addCommand(Command command) {
    commands.add(command);
  }

  void executeCommands() {
    for (Command command in commands) {
      command.execute();
    }
  }
}

void main() {
  var invoker = Invoker();

  // Создание команд и добавление их в инициатор
  var command1 = ConcreteCommand1('Построить кузов');
  var command2 = ConcreteCommand2('Установить двигатель');
  invoker.addCommand(command1);
  invoker.addCommand(command2);

  // Выполнение команд
  invoker.executeCommands();
}
Будет напечатано:
Выполняется команда 1: Построить кузов
Выполняется команда 2: Установить двигатель
Рейтинг: 0/5 - 0 голосов