• 【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

    在这里插入图片描述

  • 相关阅读:
    基于机器学习的古代汉语自动分词标注算法及语料库研究
    下拉框comobox--可勾选多个表项check
    数据安全峰会2022 | 美创DSM获颁“数据安全产品能力验证计划”评测证书
    javaEE基于springboot民宿推荐系统springmvc+mybatis+jsp]
    死亡游戏:密室互猜硬币规则及其破解方法
    【C++】Qt的属性系统,简单示例
    oracle学习42-增加表空间
    如何恢复回收站删除的文件?
    Leecode刷题 876. 链表的中间结点——链表
    vue2技能树(1)
  • 原文地址:https://blog.csdn.net/weixin_42097108/article/details/133847631