C++设计模式详解之命令模式解析

C++ 命令模式定义

  • 命令模式将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。

  • 个人理解: 命令模式,其实实质上就是去耦合的操作,让各个部分尽可能的关联性降低,以便修改或增加某些功能。

命令模式实例

简单的来说,就是订外卖,就是最好的命令模式的展示,用户下单,订单再通知到商户,商户执行操作。

  • 示例代码如下:

头文件: 定义厨师 店长 命令 以及用户调用的类

#include "stdafx.h"

using namespace std;

//Receiver基类
class Receiver
{
public:
	virtual void Action() = 0;
	virtual void DeleteAction()= 0;
};

//厨师
class CookReceiver:public Receiver
{
public:
	void Action();
	void DeleteAction();
};

//店长
class ManagerReceiver:public Receiver
{
public:
	void Action();
	void DeleteAction();
};

//命令基类
class Command
{
public:
	virtual void Excute() = 0;
	virtual void SetReceiver(Receiver* r) = 0;
};

class AddCommand:public Command
{
private:
	list<Receiver*>m_list_receiver;

public:
         void Excute();
		 void SetReceiver(Receiver* r) ;
};

class DelCommand:public Command
{
private:
	list<Receiver*>m_list_receiver;

public:
	void Excute();
	void SetReceiver(Receiver* r) ;
};

//执行命令类
class Invoker
{
private:
	list<Command*>m_commands;
public:
	void setCommand(Command* c);
	void Notify();
};

实现文件:

// CommandDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "CommandDemo.h"

using namespace std;

//具体实现
//Invoker类

void Invoker::setCommand(Command* c)
{
	m_commands.push_back(c);
}

void Invoker::Notify()
{
	//执行对应操作
	for (auto c_com = m_commands.begin();c_com!=m_commands.end();c_com++)
	{
		(*c_com)->Excute();
	}
}

//Command类
void AddCommand::SetReceiver(Receiver* r)
{
	m_list_receiver.push_back(r);
}

void AddCommand::Excute()
{
	//执行对应操作
	for (auto c_com = m_list_receiver.begin();c_com!=m_list_receiver.end();c_com++)
	{
		(*c_com)->Action();
	}
}


void DelCommand::SetReceiver(Receiver* r)
{
	m_list_receiver.push_back(r);
}

void DelCommand::Excute()
{
	//执行对应操作
	for (auto c_com = m_list_receiver.begin();c_com!=m_list_receiver.end();c_com++)
	{
		(*c_com)->DeleteAction();
	}
}

//Receiver类
void CookReceiver::Action()
{
	cout << "厨师炒菜" << endl;
}

void CookReceiver::DeleteAction()
{
	cout << "厨师下班" << endl;
}

void ManagerReceiver::Action()
{
	cout << "店长接单" << endl;
}

void ManagerReceiver::DeleteAction()
{
	cout << "店长下班" << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	//设置命令
	Command *del_c = new DelCommand(); //结束的命令
	Receiver* del_r = new CookReceiver(); //设置接收者为厨师
	del_c->SetReceiver(del_r); //这个命令是给厨师的
	
	Command *add_c = new AddCommand(); //添加的命令
	Receiver* add_r = new ManagerReceiver(); //设置接收者为店长
	add_c->SetReceiver(add_r); //这个命令是给厨师的

	//调用命令
	Invoker inv_i;
	inv_i.setCommand(del_c);//设置执行的命令
	inv_i.setCommand(add_c);
	//执行
	inv_i.Notify();
	system("pause");
	return 0;
}

运行结果:

命令模式优缺点

  • 最大的优点就是去耦合 更方便的去实现业务
  • 缺点就是类特别多 需要实现的类很多,管理上面不太方便。
发布了365 篇原创文章 · 获赞 80 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/Giser_D/article/details/103894674