设计模式之命令模式(Command)的C++实现

1、命令模式的提出

在软件开发过程中,"行为请求者"和"行为实现者"通常呈现一种"紧耦合",如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。

2、需求描述

有2两种不同的行为,两种不同行为分别对应不同的操作。设计一个代码,可以实现不同的行为对应不同的处理行为。

3、功能实现

(1)UML图如下:

(2)代码实现如下:

cpp 复制代码
#include <iostream>
#include <vector>

// 命令接口
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<Command*> 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;
}

程序运行结果如下:

相关推荐
syt_101333 分钟前
设计模式之-工厂模式
javascript·单例模式·设计模式
syt_10133 小时前
设计模式之-装饰器模式
设计模式·装饰器模式
看见繁华4 小时前
C++ 设计模式&设计原则
java·c++·设计模式
雨中飘荡的记忆8 小时前
观察者模式:从理论到生产实践
java·设计模式
阿波罗尼亚9 小时前
Head First设计模式(十二) 设计原则 复合模式
设计模式
老朱佩琪!9 小时前
Unity原型模式
开发语言·经验分享·unity·设计模式·原型模式
拾忆,想起10 小时前
设计模式三大分类完全解析:构建高质量软件的基石
xml·微服务·设计模式·性能优化·服务发现
老朱佩琪!10 小时前
Unity装饰器设计模式
unity·设计模式
syt_101310 小时前
设计模式之-策略模式
设计模式·bash·策略模式
老鼠只爱大米11 小时前
Java设计模式之代理模式(Proxy)深度解析
java·设计模式·代理模式·proxy pattern·java设计模式·proxypattern