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

c++命令模式

C++的命令模式是一种行为模式,通过将请求封装成对象,以实现请求发送者和接受者的解耦。

在命令模式中,命令被封装成一个包含特定操作的对象 ,这个对象包含的执行该操作的方法,以及一些必要的参数。命令对象可以被任意添加、删除或者修改,从而使得请求的发送者和接受者之间的关系变得灵活可配。

命令模式通过包含以下角色:

1.命令接口:定义了执行操作的方法;

2.具体命令:实现了命令接口,封装了具体的操作和接受者;

3.请求发送者:持有命令对象,并在需要时调用命令对象的执行方法来发起请求;

4.请求接受者:执行命令对象所指定的操作。

当请求发送者需要发送一个请求时,他创建一个具体命令对象并设置请求的接受者。然后,将命令对象传递给请求发送者,并由请求发送者调用命令对象的执行方法。命令对象会负责调用接受者的响应方法来执行请求中指定的操作。

优点:就是将请求封装成对象,提供一种灵活的方式来组织和管理请求,从而实现请求发送者和接受者之间的解耦。

代码实例

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

cpp 复制代码
#include<iostream>
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();
}

在这里插入图片描述

相关推荐
晴天的雨.9929 分钟前
[C++算法]盛最多水的容器(双指针算法)
开发语言·c++·算法
布莱克60527 分钟前
理解内存泄漏:成因、发现方法与解决策略(C++ 举例)
c语言·c++·内存泄漏
Shadow(⊙o⊙)43 分钟前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
此生决int1 小时前
深入理解C++系列(19)——C++11(上)
开发语言·c++
郝学胜-神的一滴1 小时前
C++20模板元编程 05:吃透变参模板,解锁编译期万能参数能力
服务器·开发语言·c++·windows·vscode
C++ 老炮儿的技术栈11 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
sarasuki16 小时前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
I_belong_to_jesus16 小时前
std::unique_ptr成员函数用法
c++
Tairitsu_H17 小时前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象
汉克老师18 小时前
GESP2026年9月认证C++四级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程