在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”,如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。
有2两种不同的行为,两种不同行为分别对应不同的操作。设计一个代码,可以实现不同的行为对应不同的处理行为。
(1)UML图如下:
(2)代码实现如下:
- #include
- #include
-
- // 命令接口
- class Command {
- public:
- Command(std::string cmd):m_strCmd(cmd){};
- virtual ~Command() {}
- virtual void execute() = 0;
- std::string& getCmd(){return m_strCmd;};
- private:
- std::string m_strCmd;
- };
-
-
- class ConcreteCommand1 : public Command {
- public:
- ConcreteCommand1(std::string str):Command(str){};
- void execute() override {
- std::cout << "ConcreteCommand1: " << getCmd() << std::endl;
- // todo something...
- }
- };
-
- class ConcreteCommand2 : public Command {
- public:
- ConcreteCommand2(std::string str):Command(str){};
- void execute() override {
- std::cout << "ConcreteCommand2: " << getCmd() << std::endl;
- // todo something...
- }
- };
-
- // 命令请求者
- class Requester {
- private:
- std::vector
m_vecCommands; -
- public:
- void aadCommand(Command* cmd) {
- m_vecCommands.emplace_back(cmd);
- }
-
- void executeCommand() {
- for(auto& it:m_vecCommands)
- {
- it->execute();
- }
- }
- };
-
- class Client
- {
- public:
- void doWork()
- {
- Requester request;
- Command* command1 = new ConcreteCommand1("Command1");
- Command* command2 = new ConcreteCommand2("Command2");
-
- request.aadCommand(command1);
- request.aadCommand(command2);
- request.executeCommand();
-
- delete command1;
- delete command2;
- command1 = nullptr;
- command2 = nullptr;
- };
- }
-
- int main() {
- Client obj;
- obj.doWork();
- return 0;
- }
程序运行结果如下: