行为型 命令模式

命令模式(Command Pattern):种数据驱动的设计模式。请求以命令的形式包裹在对象中,将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

命令模式

概要分析:

​ 实现了发送者和接收者的完全解耦,

​ 1:可以定义一个命令基类,统一接口,供不同的子类处理不同的命令,以及提供统一接口调用。

​ 2:可以定义一个命令的管理类,根据不同的输入内容,构造不同的具体类,调用执行单个命令。

​ 也可以管理一系列的命令,统一一次执行。

定义命令类,存储命令,定义命令的行为==》基类的方式,保存不同的动作

命令的执行者类,

命令的管理者: 存储命令,执行命令==》真正调度

适用场景:

系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

系统需要在不同的时间指定请求、将请求排队和执行请求。

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

系统需要将一组操作组合在一起,即支持宏命令

源码Demo:

简单的命令模式,可以再加一个管理类,根据不同的入参构造不同的子类,使用更方便。

/****************************************************************************************************************
命令模式:
	说白了就是通过中间人专门去管理这个命令,将这个中间人称为管理命令类,由这个中间人完成指令的发送动作

适用于:
	是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

实现方法:
	创建命令:
		内部构造使用对象注入技术,完成对象调用的绑架  +  executecommand接口定义
		不同的命令中完成命令的执行者函数
			(executecommand重写)+ executecommand(去调用具体执行者的函数) 
*****************************************************************************************************************/
#include<iostream>
#include<string>
#include<list>
using namespace std;
class barbecuer //执行指令的类
{
public:
	void bakemutton(){
	  cout << "烤羊肉串" << endl;
	}
	void bakechickenwing(){
	  cout << "烤鸡翅" << endl;
	}
};

class Command   //命令基类,既包含了命令基类的赋值,也定义了相关操作的接口
{
protected://命令类很关键的一步是,告诉大家谁去接受这个指令
	barbecuer *receiver;//类的包含
public:
	Command(barbecuer*receiver) //命令类很关键的一步是,告诉大家谁去接受这个指令
	{  
		this->receiver = receiver;
	}
	virtual void executecommand() = 0;
};

//不同的命令执行1
class bakermuttoncommand :public Command //命令传送者
{
public:
	bakermuttoncommand(barbecuer*receiver) :Command(receiver){}
	void executecommand(){
		receiver->bakemutton();
	}//执行烤羊肉串
};

//不同的命令执行2
class bakechikenwingcommand :public Command //命令传送者
{
public:
	bakechikenwingcommand(barbecuer*receiver) :Command(receiver){}
	void executecommand(){
		receiver->bakechickenwing();
	}//执行烤鸡翅
};

class waiter //服务员单一,一次只能给一个对象下达指令
{
private:
	Command *command;
public:
	void setorder(Command*command) //对象注入技术,对象的赋值
	{
		this->command = command;
	}
	void notify(){
		command->executecommand();
	}
};

//这个类对单一服务员的时候,可有可无。只是为了说明下面的超级服务员做铺垫
class waiter2  //超级服务员,通过list可以给多个对象下达命令进行操作
{
private:
	list<Command*>orders;
public:
	void setorder(Command*command){
		orders.push_back(command);
	}
	void cancelorder(Command *command){}
	void notify()
	{
		list<Command*>::iterator iter = orders.begin();
		while (iter != orders.end())
		{
			(*iter)->executecommand();
			iter++;
		}
	}
};

int main()
{
	barbecuer *boy = new barbecuer;//创建一个执行动作的对象
	Command *bm1 = new bakermuttoncommand(boy);//来一个命令创建一次,传送一次命令
	//在bakermuttoncommand里面完成对executecommand的操作
	//命令类,在基类中完成命令的执行者赋值(使用初始化列表)
	bm1->executecommand();
	Command *bm2 = new bakermuttoncommand(boy);
	Command *bc1 = new bakechikenwingcommand(boy);

	waiter2 *girl = new waiter2();//使用超级服务员,去管理这些个命令
	girl->setorder(bm1);
	girl->setorder(bm2);
	girl->setorder(bc1);

	girl->notify();
	// system("pause");

	delete boy;
	delete bm2;
	delete bm1;
	delete bc1;
	delete girl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yun6853992/article/details/119132821