行为型模式之命令模式实现
来源:互联网 发布:青苹果申报数据库 编辑:程序博客网 时间:2024/05/16 18:01
概念
命令模式是行为设计模式的一种。命令模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。
在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。
但在有些情况下必须要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
调用前后需要对调用参数进行某些处理。调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。
角色和职责
Command:Command命令的抽象类;
ConcreteCommand: Command的具体实现类;
Receiver: 需要被调用的目标对象;
Invorker: 通过Invorker执行Command对象。
适用于:是将一个请求封装成为一个对象,从而使你可用不同请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
案例
#include <iostream>using namespace std;class Vendor {public: void sailBanana() { cout << "卖香蕉" << endl; } void sailApple() { cout << "卖苹果" << endl; }};class Command{public: virtual void sail() = 0;};class BananaCommand:public Command{public: BananaCommand(Vendor *v) { m_v = v; } Vendor *getV() { return m_v; } void setV(Vendor *v) { m_v = v; } virtual void sail() { m_v->sailBanana(); }private: Vendor *m_v;};class AppleCommand:public Command{public: AppleCommand(Vendor *v) { m_v = v; } Vendor *getV() { return Vendor; } void setV(Vendor *v) { m_v = v; } virtual void sail() { m_v->sailApple(); }private: Vendor *m_v;};class Waiter{public: Command *getCommand() { return m_command; } void setCommand(Command *c) { m_command = c; } void sail() { m_command->sail(); }private: Command *m_command;};class AdvWaiter{public: AdvWaiter() { m_list = new list<Command *>; m_list->resize(0); } ~AdvWaiter() { delete m_list; } list<Command *> *getCommand() { return list; } void setCommand(Command *c) { m_list->push_back(c); } void sail() { for(list<Command *>::iterator it = m_list->begin(); it != m_list->end(); it++) { (*it)->sail(); } }private: list<Command *> *m_list;};//小商贩 **直接** 卖 水果void main1(){ Vendor *v = new Vendor(); v->sailApple(); v->sailBanana(); delete v; return;}//小商贩 **通过命令** 卖 水果void main2(){ Vendor *v = new Vendor(); AppleCommand *ac = new AppleCommand(v); ac->sail(); BananaCommand *bc = new BananaCommand (v); ac->sail(); delete bc; delete ac; delete v;}//小商贩 **通过wait** 卖 水果void main3(){ Vendor *v = new Vendor(); AppleCommand *ac = new AppleCommand(v); BananaCommand *bc = new BananaCommand(v); Waiter *w = new Waiter(); w->setCommand(ac); w->sail(); w->setCommand(bc); w->sail(); delete w; delete bc; delete ac; delete v;}//小商贩 **通过AdvWait** 卖 水果void main4(){ Vendor *v = new Vendor(); AppleCommand *ac = new AppleCommand(v); BananaCommand *bc = new BananaCommand(v); AdvWaiter *w = new AdvWaiter(); w->setCommand(ac); w->setCommand(bc); w->sail(); delete w; delete bc; delete ac; delete v;}int main(void){ //main1(); //main2(); //main4(); main4(); return 0;}
阅读全文
0 0
- 行为型模式之命令模式实现
- 行为型之命令模式
- 设计模式-行为型之命令模式
- 行为模式之命令模式
- 行为模式之命令模式
- 行为型模式之模板模式实现
- 行为型模式之策略模式实现
- 行为型模式之观察者模式实现
- 行为型模式之备忘录模式实现
- 行为型模式之访问者模式实现
- 行为型模式之状态模式实现
- 行为型模式之迭代器模式实现
- 行为模式之命令模式(Command Pattern)C++实现
- Java设计模式之行为型模式(命令模式)
- 设计模式(四):行为型模式之命令模式
- 行为型模式----命令模式
- 行为型模式-命令模式
- 行为型模式--命令模式
- 端口分类调研
- php面试题---上接面试题---自写部分答案
- Java并发编程与技术内幕:线程池深入理解
- BigDecimal的加减乘除
- 音标字符粘贴和显示
- 行为型模式之命令模式实现
- 20170613
- Performance Measure of Algorithms(1)--Mathematical Background
- centos7的配置
- Java编程的整理
- 阻塞队列
- B -Escape CodeForces
- hdu1995-递推
- 还是畅通工程