设计模式——命令模式(C++)
来源:互联网 发布:php 读取文件夹 图片 编辑:程序博客网 时间:2024/05/16 12:26
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:main.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include <iostream>#include "Invoker.h"#include "Command.h"#include "Receiver.h"using namespace std;// 命令模式的优点:// 1 降低对象之间的耦合度;// 2 可以很容易添加、撤销、恢复命令;// 3 可以很容易的设计出一个组合命令;// 4 调用同一方法(action)实现不同的功能;// 缺点:// 1 若存在过多的命令,就会导致代码中出现过多的类// client(客户端)int main() { concreteReceiver* receiver = new concreteReceiver(); // 命令接收者 concreteCommandA* commandA = new concreteCommandA(receiver); // 具体命令A concreteCommandB* commandB = new concreteCommandB(receiver); // 具体命令B concreteCommandC* commandC = new concreteCommandC(receiver); // 具体命令C Invoker* invoker = new Invoker(); // 命令发起者(该对象持有许多命令,具有添加、撤销、恢复命令的功能) invoker->addCommand(commandA); // 添加命令A invoker->addCommand(commandB); // 添加命令B invoker->addCommand(commandC); // 添加命令C invoker->action(); // 执行所有命令 invoker->undoCommand(commandA); // 撤销命令A invoker->action(); // 执行所有命令 invoker->undoCommand(commandB); // 撤销命令B invoker->action(); // 执行所有命令 invoker->redoCommand(commandA); // 恢复命令A invoker->action(); // 执行所有命令 system("pause"); return 0;}// 个人理解:感觉这个模式有点像观察者模式和装饰模式的结合的味道,甚至能感觉到有一丝丝工厂方法模式的存在。
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Receiver.h@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _RECEIVER_H#define _RECEIVER_H// 抽象的接收者class Receiver {public: virtual void doA() = 0; // 接收者持有的动作A virtual void doB() = 0; // 接收者持有的动作B virtual void doC() = 0; // 接收者持有的动作C};// 具体的接收者class concreteReceiver : public Receiver {public: virtual void doA(); virtual void doB(); virtual void doC();};#endif // _RECEIVER_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Receiver.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Receiver.h"#include <iostream>using namespace std;// 抽象接收者void Receiver::doA() {}void Receiver::doB() {}void Receiver::doC() {}// 具体接收者void concreteReceiver::doA() { // 动作A cout << "do A" << endl;}void concreteReceiver::doB() { // 动作B cout << "do B" << endl;}void concreteReceiver::doC() { // 动作C cout << "do C" << endl;}
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Command.h@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _COMMAND_H#define _COMMAND_H#include "Receiver.h"class Receiver;// 抽象命令class Command {public: virtual void execute() = 0; // 执行命令};// 具体命令Aclass concreteCommandA : public Command {private: Receiver* receiver;public: concreteCommandA(Receiver* receiver); virtual void execute();};// 具体命令Bclass concreteCommandB : public Command {private: Receiver* receiver;public: concreteCommandB(Receiver* receiver); virtual void execute();};// 具体命令Cclass concreteCommandC : public Command {private: Receiver* receiver;public: concreteCommandC(Receiver* receiver); virtual void execute();};#endif // _COMMAND_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Command.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Command.h"#include <iostream>using namespace std;// 抽象命令void Command::execute() {}// 具体命令AconcreteCommandA::concreteCommandA(Receiver* receiver) { this->receiver = receiver;}void concreteCommandA::execute() { // 具体命令A执行动作A(命令A<------>动作A) receiver->doA();}// 具体命令BconcreteCommandB::concreteCommandB(Receiver* receiver) { this->receiver = receiver;}void concreteCommandB::execute() { // 命令B<------>动作B receiver->doB();}// 具体命令CconcreteCommandC::concreteCommandC(Receiver* receiver) { this->receiver = receiver;}void concreteCommandC::execute() { // 命令C<------>动作C receiver->doC();}
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Invoker.h@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _INVOKER_H#define _INVOKER_H#include "Command.h"#include <list>class Command;// 命令的发起者class Invoker {private: std::list<Command*> lst; // 命令池(类似于观察者模式中的观察者集合)public: Invoker(); Invoker(Command* command); void addCommand(Command* command); // 添加命令 void undoCommand(Command* command); // 撤销命令 void redoCommand(Command* command); // 恢复命令 void action(); // 执行所有命令 void action(Command* command); // 执行指定命令};#endif // _INVOKER_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Invoker.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Invoker.h"#include <list>using namespace std;Invoker::Invoker() {}Invoker::Invoker(Command* command) { this->addCommand(command);}// 添加命令void Invoker::addCommand(Command* command) { lst.push_back(command);}// 撤销命令void Invoker::undoCommand(Command* command) { lst.remove(command);}void Invoker::redoCommand(Command* command) { this->addCommand(command);}// 执行所有命令void Invoker::action() { list<Command*>::iterator it = lst.begin(); for (; it != lst.end(); it++) { (*it)->execute(); }}// 执行指定命令void Invoker::action(Command* command) { command->execute();}
这就完啦。。。
1 0
- 设计模式——命令模式(C++)
- 设计模式—命令模式(十九)
- 设计模式—命令模式
- 设计模式—命令模式
- 设计模式—命令模式
- 设计模式—命令模式
- 设计模式——命令设计模式
- 每日设计模式——命令模式
- 设计模式——命令模式(Commend)
- 设计模式——命令模式
- Java设计模式——命令模式
- JAVA设计模式——命令模式
- java设计模式——命令模式
- JAVA设计模式——命令模式
- 设计模式——命令模式
- 设计模式(12)——命令模式
- 设计模式——命令模式
- 设计模式——命令模式
- js作用于和预编译
- 84. Largest Rectangle in Histogram H
- 开机登录失败 提示"user profile service服务未能登录,无法加载用户配置文件" 问题解决办法
- POJ 2104 K-th Number 主席树
- Activiti 学习笔记13:分配组任务
- 设计模式——命令模式(C++)
- 自定义控件--day01笔记
- LeetCode之Valid Anagram (Java+C/C++)
- 动态污点分析浅述
- flat network 原理与配置 - 每天5分钟玩转 OpenStack(86)
- Apache Tomcat 8_源码编译、安装及调试
- 特征值与特征向量的几何意义
- 01 戴尔混合云DHCS今生与前世
- HDU3746-Cyclic Nacklace