• 【26】c++设计模式——>命令模式


    c++命令模式

    C++的命令模式是一种行为模式,通过将请求封装成对象,以实现请求发送者和接受者的解耦。
    在命令模式中,命令被封装成一个包含特定操作的对象,这个对象包含的执行该操作的方法,以及一些必要的参数。命令对象可以被任意添加、删除或者修改,从而使得请求的发送者和接受者之间的关系变得灵活可配。
    命令模式通过包含以下角色:
    1.命令接口:定义了执行操作的方法;
    2.具体命令:实现了命令接口,封装了具体的操作和接受者;
    3.请求发送者:持有命令对象,并在需要时调用命令对象的执行方法来发起请求;
    4.请求接受者:执行命令对象所指定的操作。
    当请求发送者需要发送一个请求时,他创建一个具体命令对象并设置请求的接受者。然后,将命令对象传递给请求发送者,并由请求发送者调用命令对象的执行方法。命令对象会负责调用接受者的响应方法来执行请求中指定的操作。
    优点:就是将请求封装成对象,提供一种灵活的方式来组织和管理请求,从而实现请求发送者和接受者之间的解耦。

    代码实例

    遥控器作为请求发送者,可以控制不同的家庭设备(灯,电视等),每个家庭设备都有相应的命令,每个命令包括特定的接受者。

    #include
    using namespace std;
    //命令接口
    class Command 
    {
    public:
    	virtual void execute() = 0;
    };
    
    //具体命令类:扩展一个控制灯的命令
    class LightCommand :public Command
    {
    private:
    	class Light
    	{
    	public:
    		void turnOn()
    		{
    			cout << "开灯" << endl;
    		}
    		void turnOff()
    		{
    			cout << "关灯" << endl;
    		}
    	};
    	Light light;
    public:
    	void execute() override
    	{
    		light.turnOn();
    	}
    };
    
    //具体命令类:扩展一个控制电视的命令
    class TVCommand :public Command
    {
    private:
    	class TV
    	{
    	public:
    		void turnOn()
    		{
    			cout << "开TV" << endl;
    		}
    		void turnOff()
    		{
    			cout << "关TV" << endl;
    		}
    	};
    	TV tv;
    public:
    	void execute() override
    	{
    		tv.turnOn();
    	}
    };
    
    //命令发送者:遥控器
    class RemoteControl
    {
    private:
    	Command* command; //保存命令
    public:
    	void setCommand(Command* cmd)
    	{
    		command = cmd;
    	}
    	void pressButton()
    	{
    		command->execute();
    	}
    };
    int main()
    {
    	//创建一个遥控器:命令发送者
    	RemoteControl rc;
    
    	//创建两个命令:灯和TV
    	LightCommand lc;
    	TVCommand tv;
    
    	//遥控器设置灯命令,然后发送
    	rc.setCommand(&lc);
    	rc.pressButton();
    
    	//遥控器设置tv命令,然后发送
    	rc.setCommand(&tv);
    	rc.pressButton();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

    在这里插入图片描述

  • 相关阅读:
    互联网真实赚钱平台有哪些?分享六大类正规靠谱的线上平台
    大厂面试都在问的高并发问题汇总【精选】,附代码案例
    教你2种方法,将iOS设备通过MQTT协议连接到华为云物联网平台
    华为交换技术:BGP基础实验
    pthread_mutex_unlock
    Lesson14:Linux基础操作和web程序部署
    对于一个即将上线的网站,如何测试
    React源码分析3-render阶段(穿插scheduler和reconciler)
    openlayers wms/wmts 栅格图层点击点像元值查询
    【高危安全通告】Oracle 10月月度安全漏洞预警
  • 原文地址:https://blog.csdn.net/weixin_42097108/article/details/133847631