设计模式C++实现——命令模式

本文介绍了设计模式中的命令模式,其将请求封装为对象,用于参数化其他对象,支持可撤销操作。通过实例展示了如何在C++中实现命令模式,如遥控器控制电灯的开关,使用命令对象封装动作和接受者,实现请求与执行的解耦。

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

模式定义:

        命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

        命令对象将动作和接受者包进对象中,这个对象只暴露一个execute()方法。

        当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。

模式结构:

举例:

        遥控器上有一个插槽,可以放上不同的装置,然后用按钮控制。我们这里放置电灯,并有开和关按钮。可以命令模式实现。

UML设计:


        其中,RemoteControl为遥控器,LightOnCommand为开灯请求对象,LightOffCommand为关灯请求对象,他们继承自基类Command,这样设计可以使插槽在以后防止其他的装置。

编程实现及执行结果:

#include <iostream>

using namespace std;

//电灯类
class Light
{
public:
	void on()
	{
		cout << "Light on !" << endl;
	}

	void off()
	{
		cout << "Light off !" << endl;
	}
};
//命令类
class Command
{
public:
	virtual void execute(){}
};
//具体命令类
class LigthOnCommand : public Command
{
public:
	LigthOnCommand(Light* lig):light(lig){}
	//execute方法
	void execute()
	{
		light->on();
	}
private:
	Light* light;
};

class LigthOffCommand : public Command
{
public:
	LigthOffCommand(Light* lig):light(lig){}
	void execute()
	{
		light->off();
	}
private:
	Light* light;
};

//遥控器类
class RemoteControl
{
public:
	void setCommand(Command* command)
	{
		slot = command;
	}
	void buttonOn()
	{
		slot->execute();
	}
private:
	Command* slot;
};
//客户代码
int main()
{
	RemoteControl lightOnControl;
	RemoteControl lightOffControl;

	Command* onCommand = new LigthOnCommand(new Light());
	Command* offCommand = new LigthOffCommand(new Light());

	lightOnControl.setCommand(onCommand);
	lightOffControl.setCommand(offCommand);

	lightOnControl.buttonOn();
	lightOffControl.buttonOn();

	return 0;
}


执行结果:

Lighton !

Lightoff !

请按任意键继续. . .

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值