@egorggegor

Правильно я понял паттерн Command?

Всем привет, решил изучить паттерн Command, правильно ли я понимаю, он оборачивает сами команды в объекты, что добавляет гибкости программе?
5d5c1c19677f5701960897.png
Сам Invoker здесь самый главный, который все и кастует?) То есть у него должны быть методы для выполнения каких-либо команд или мы сами задаем команду, которую должен исполнить Invoker?
(Как я понял, паттерн должен выглядеть так, подскажите, правильно ли я понял?)
class Command {
public:
    virtual ~Command() {};
    virtual void Execute() = 0;
};

class Receiver {
public:
    void Command1() {};
    void Command2() {};
};

class ConcreteCommand1 : public Command {
public:
    ConcreteCommand1(Receiver* other_purpose): purpose(other_purpose) {};
    void Execute() {
        purpose->Command1();
    }
private:
    Receiver* purpose;
};

class ConcreteCommand2 : public Command {
public:
    ConcreteCommand2(Receiver* other_purpose): purpose(other_purpose) {};
    void Execute() {
        purpose->Command2();
    }
private:
    Receiver* purpose;
};

class Invoker {
public:
    void SetCommand(Command* other_cmd) {
        this->cmd = other_cmd;
    }
    void ExecuteCommand() {
        this->cmd->Execute();
    }
private:
    Command* cmd;
};
  • Вопрос задан
  • 680 просмотров
Решения вопроса 1
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
Основное нужно понять, что Есть два класса:
1. Команда
2. Обработчик.

Команда передается в обработчик и уже в обработчике вызывается метод "обработай". Чтобы более детально понять как это работает на практике и для чего это нужно предлагаю почитать о CQRS

https://blog.byndyu.ru/2014/05/blog-post.html
https://blog.byndyu.ru/2014/07/command-and-query-r...

И пример как это сделано на PHP
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SergeyEgorov
@SergeyEgorov
Веб разработчик
Решил что-ли все шаблоны разом выучить? Суть шаблона команда в том, что внутри может быть инкапсулировано любое поведение, а выполнено оно может быть унифицировано, каким угодно пользователем:

public interface Command
{
  void execute();
}

public class FindUserCommand : Command
{
  public void execute()
  {
    /// Здесь у нас код, который ищет пользователя
  }
}

public class DeleteUserCommand : Command
{
  public void execute()
  {
    /// А здес у нас код, который удаляет пользователя
  }
}

FindUserCommand findUser = new FindUserCommand();
DeleteUserCommand deleteUser = new DeleteUserCommand();

/// Поскольку оба этих класса реализуют абстракцию Command
/// мы можем поместить их экземпляры например в коллекцию
 
HashSet<Command> commands = new HashSet<Command>();
commands.Add(findUser);
commands.Add(deleteUser);

/// И отдать затем эту коллекцию кому-нибудь, кто вообще 
/// ничего не знает про FindUserCommand и DeleteUserCommand
/// а знает только про Command. И не смотря на это, этот кто-то
/// совершенно спокойно может выполнить инкапсулированное 
/// внутри команд поведение.

foreach(Command command in commands)
{
  command.execute();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы