c++设计模式之命令模式
2016-07-27 21:34
357 查看
命令模式
定义:命令模式(Command)模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
意图:
提供一个抽象的Command接口,将执行命令操作的方法封装到Command类接口中,ConcreteCommand实现这个Command接口方法,通过调用Receiver实例变量处理请求。客户端定义一个Invoker对象存储该concreteCommand对象,该invoker通过调用command对象的递交一个请求。
参与角色:
抽象命令角色(Command):
定义命令的接口,声明执行的方法。
具体命令角色(ConcreteCommand):
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
请求者(Invoker):
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。 收者(Receiver、执行者):
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
客户端(Client):
创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
命令模式的类结构图:
兑现代码:
定义:命令模式(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"); }
相关文章推荐
- 利用C++11新特性重构自定义Button
- 深度探索c++对象模型-阅读笔记
- c语言指针操作
- Leetcode 73. Set Matrix Zeroes (Medium) (cpp)
- c++重载、覆盖、隐藏
- 由static_cast和dynamic_cast到C++对象占用内存的分析
- stack应用--矩阵乘法次数计算
- 用Mac终端编写,编译C程序的实例
- [kuangbin带你飞]专题十四 数论基础-C - Aladdin and the Flying Carpet
- 简单点,switch-case的结构简单点~ C语言学习(4)
- c++内联函数(inline)使用详解
- Leetcode 229. Majority Element II (Medium) (cpp)
- Flatten Binary Tree to Linked List
- C ++ 虚函数 (转)
- C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别
- c++实现图像旋转任意角度
- 趣味100道C语言程序题num six
- c++设计模式之模板模式
- 设计模式之观察者设计模式(C++实现)
- C语言学习