您的位置:首页 > 编程语言 > C语言/C++

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

2016-07-27 21:34 357 查看
命令模式

定义:命令模式(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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: