c++小心得之3: 命令模式

本文深入探讨了命令模式的设计原理,包括其在降低调用者与执行者耦合度方面的优势,以及如何通过命令类对基本操作进行封装。文章还介绍了命令模式在GUI开发、事务处理等场景的应用,并提供了一个详细的C++实现案例。

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

命令模式:在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装;

优点:
1.命令的调用者与执行者分开,调用者只需知道命令类即可,使双方不必关心对方是如何操作的,耦合度要比把所有的操作都封装到一个类中要低的多;这也是命令模式的精髓所在;
2.耦合度低,加进新的命令类不影响其他的类,因此扩展命令类很容易。

扩展:
1.当一个命令需要多个接收者/执行者时,可以在命令内set多个接受者,完成通力合作的问题;
2. 结合责任链模式实现命令族解析任务;结合模板方法,减少Command子类的膨胀

缺点:
如果命令很多,使用命令模式,会比直接执行命令工作量多很多,尤其是只需要几行代码即可实现的命令很多时。

实例:
1.数据库中的事务;
2.只要认为是命令的地方。如 GUI 开发,按钮,DOS命令模拟,触发反馈机制的处理等;

#include <iostream>
#include <vector>

using namespace std;

class Barbecuer
{
public:
	Barbecuer()
	{

	}

	void bakeMutton()
	{
		cout << "bakeMutton" << endl;
	}

	void bakeChickenWing()
	{
		cout << "bakeChickenWing" << endl;
	}

};

class Command
{
public:
	Command(Barbecuer* barbecuer)
	{
		m_barbecuer = barbecuer;
	}

	virtual void executeCommand() = 0;

	Barbecuer *m_barbecuer;
};

class BakeMuttonCommand : public Command
{
public:
	BakeMuttonCommand(Barbecuer *barbecuer) : Command(barbecuer)
	{

	}

	void executeCommand()
	{
		m_barbecuer->bakeMutton();
	}
};

class BakeChickenWingCommand : public Command
{
public:
	BakeChickenWingCommand(Barbecuer *barbecuer) : Command(barbecuer)
	{

	}

	void executeCommand()
	{
		m_barbecuer->bakeChickenWing();	
	}
};

class Waiter
{
public:
	Waiter()
	{

	}

	void setCommand(Command* cmd)
	{
		m_command_vector.push_back(cmd);
	}

	void removeCommand(Command *cmd)
	{
		vector<Command*>::iterator it;
		for(it = m_command_vector.begin(); it != m_command_vector.end(); it++)
		{
			if((*it) == cmd)
			{
				m_command_vector.erase(it);
				break;
			}	
		}
	}

	void notify()
	{
		vector<Command*>::iterator it;
		for(it = m_command_vector.begin(); it != m_command_vector.end(); it++)
		{
			(*it)->executeCommand();
		}
	}
	vector<Command*> m_command_vector;
};


int main()
{
	Barbecuer *p_barbecuer = new Barbecuer;
	Command *p_bakemutton = new BakeMuttonCommand(p_barbecuer);
	Command *p_bakechicken = new BakeChickenWingCommand(p_barbecuer);

	Waiter* p_waiter = new Waiter;
	p_waiter->setCommand(p_bakemutton);
	p_waiter->setCommand(p_bakechicken);

	p_waiter->notify();

	p_waiter->removeCommand(p_bakemutton);
	p_waiter->notify();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值