c++设计模式之命令模式

命令模式

定义命令模式(Command)模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

意图
提供一个抽象的Command接口,将执行命令操作的方法封装到Command类接口中,ConcreteCommand实现这个Command接口方法,通过调用Receiver实例变量处理请求。客户端定义一个Invoker对象存储该concreteCommand对象,该invoker通过调用command对象的递交一个请求。

参与角色

抽象命令角色(Command):
定义命令的接口,声明执行的方法。
具体命令角色(ConcreteCommand):
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
请求者(Invoker):
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。 收者(Receiver、执行者):
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
客户端(Client):
创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。 

命令模式的类结构图:


兑现代码:

</pre><pre name="code" class="cpp">#include <iostream>
#include "list"
using namespace std;
//Receiver 接收者或执行者
class Doctor
{
public:
	void treat_eye()
	{
		cout<<"医生看眼病"<<endl;
	}
	void treat_nose()
	{
		cout<<"医生看鼻子"<<endl;
	}
};
//Commad类就是所谓的抽象层,用于调用实现者的功能。
//其实实现者有可能是别的独有的类,这时就要用到组合的模式将实现者对象包含在分装类中
//继承当然也可以,但是设计模式中推荐少用继承,多用组合。
class Command
{
public:
	virtual void treat()=0;
};
//具体命令角色 ConcreteCommand
class CommandTreatEye:public Command
{
public:
	CommandTreatEye(Doctor*doctor)
	{
		m_doctor = doctor;
	}
	void treat()
	{
		m_doctor->treat_eye();
	}
private:
	Doctor *m_doctor;
};
//具体命令角色 ConcreteCommand
class CommandTreatNose:public Command
{
public:
	CommandTreatNose(Doctor*doctor)
	{
		m_doctor = doctor;
	}
	void treat()
	{
		m_doctor->treat_nose();
	}
private:
	Doctor *m_doctor;
};
//请求者Invoker 可以持有命令对象
class BeautyNurse
{
public:
	BeautyNurse(Command *command)
	{
		this->m_command = command;
	}
	void SubmitCase()
	{
		m_command->treat();
	}
private:
	Command *m_command;
};
//护士长 请求者Invoker 可以持有命令对象集合
class HeadNurse
{
public:
	HeadNurse()
	{
		m_list.clear();
	}
	void setCommand(Command*command)
	{
		m_list.push_back(command);
	}
	void SubmitCases()
	{
		for(list<Command*>::iterator it = m_list.begin();it!=m_list.end();it++)
		{
			(*it)->treat();
		}
	}
private:
	
	list<Command*> m_list;
};
//client
void main()
{
	//护士提交病例,医生看病
	//BeautyNurse *beautynurse=NULL;
	HeadNurse * headnurse = NULL;
	Doctor *doctor=NULL;
	Command *command1=NULL;
	Command *command2=NULL;

	doctor= new Doctor();
	command1 = new CommandTreatNose(doctor);
	command2 = new CommandTreatEye(doctor);
	//beautynurse = new BeautyNurse(command);
	headnurse = new HeadNurse();
	headnurse->setCommand(command1);
	headnurse->setCommand(command2);
	headnurse->SubmitCases();

	delete headnurse;
	delete command1;
	delete command2;
	delete doctor;

	system("pause");
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值