【设计模式】C++ 实现命令模式

本文介绍了命令模式的概念,它是一种对象行为型设计模式,允许将命令作为对象进行传递,从而可以参数化不同对象,并支持撤销操作。文章通过空调遥控器的例子,详细解释了命令模式的四个角色:请求者、命令者、接收者和客户端,并展示了简单的C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

命令模式,通常指的是一个对象向另外一个对象发送信息指令的行为模型,比如父母命令孩子写作业,将军命令士兵进攻,点击菜单选择页面等。

请求者只需要发出命令,至于命令的接受者,如何实现命令,则由命令的接收者来关心。

命令模式由4个角色组成,请求者角色、命令者角色、接收者角色和客户端角色。

夏天到了,炎炎烈日,都要靠空调续命,这里就以给空调调节温度为例子。空调是接收者角色,由它来执行具体的升高温度或者降低温度的操作;遥控器就是请求者角色,由遥控器发出温度+或者温度-的命令请求;命令者角色是这里的温度+或者温度-;至于拿着遥控器的我们,则是客户端角色。

 


UML类图

 


命令模式的简单实现

#include <stdio.h>


//接收者角色 空调,具体是实现温度控制的逻辑代码
class AirConditioner
{
	public :
	  void tempretureUp()
	  {
	   printf("空调温度 +1 \n");
	  }

	  void tempretureDown()
	  {
	  printf("空调温度 -1 \n");
	  }
};


//命令者角色的抽象接口
class Command
{
	protected:
	    AirConditioner *receiver;

	public:
		Command(AirConditioner *air_conditioner)
		{
			receiver = air_conditioner;
		}

		virtual void executeCmd() = 0;
};

//温度+命令
class TempretureUpCmd: public Command
{
	public:
		TempretureUpCmd(AirConditioner *air_conditioner):Command(air_conditioner){}
		virtual void executeCmd()
		{
			receiver->tempretureUp();
		}
};

//温度-命令
class TempretureDownCmd: public Command
{
	public:
	TempretureDownCmd(AirConditioner *air_conditioner):Command(air_conditioner){}
	virtual void executeCmd()
	{
		receiver->tempretureDown();
	}
};

//请求者 遥控器
class RemoteControl
{
	public:
		RemoteControl(){};
	   void bindTempreturUpCmd(Command *cmd)
	   {
	   		tempretureUp = cmd;
	   }
	   void bindTempreturDownCmd(Command *cmd)
	   {
	   		tempretureDown = cmd;
	   }
	   void controlTempretureUp()
	   {
	   		tempretureUp->executeCmd();
	   }
	   void controlTempreturDown()
	   {
	   		tempretureDown->executeCmd();
	   }
	protected:
	   Command *tempretureUp;
	   Command *tempretureDown;
};

//客户端
int main(int argc,char **argv)
{
	//创建好遥控器、空调、命令
	AirConditioner *conditioner = new AirConditioner();
	RemoteControl *control = new RemoteControl();
	Command *tempUp = new TempretureUpCmd(conditioner);
	Command *tempDown = new TempretureDownCmd(conditioner);

	//绑定空调的【命令】到【遥控器】
	control->bindTempreturUpCmd(tempUp);
	control->bindTempreturDownCmd(tempDown);

	//执行命令
	control->controlTempretureUp();
	control->controlTempreturDown();

	/*
	输出结果:
	空调温度 +1
	空调温度 -1
	*/
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值