设计模式之命令模式
来源:互联网 发布:注销淘宝店铺重新开通 编辑:程序博客网 时间:2024/06/06 08:40
命令模式是一种很巧妙很强大的设计模式,比如常见的操作系统里面的消息队列等消息发送机制都用到了命令模式,良好的命令模式设计主要解决以下两点,1,命令发起者和命令发送方式的耦合度(即命令发起者可以有不同的命令发送方式),2.命令发送方式与命令的耦合度(即每种命令发送方式可以发送任何类型的命令)。我这示例的命令发送方式用消息队列实现,这也是最常见的一种方式。
命令模式:
以下代码在Xcode7上编译通过
.h文件:
#include<list>using namespace std;class commonCommand//命令基础抽象类{ public : virtual void excuteCommand();//执行命令};class CommandA : public commonCommand//具体命令类A{ public : void excuteCommand(); };class CommandB : public commonCommand//具体命令类B{ public : void excuteCommand(); };class commandQueue//消息队列类{private: list<commonCommand*> m_commandList;public: void addCommand(commonCommand* cmd_m);//往消息队列添加命令 void removeCommand(commonCommand*);//移除消息队列里的某个命令 void excuteAll();//执行消息队列里的所有命令 void eccuteCommand(commonCommand*);//执行消息队列里的某个命令};class commandStarter//命令发起类{private: commandQueue* m_Queue;//消息队列public: void setCommandQueue(commandQueue*);//添加消息队列 void startCommandAll();//执行所有命令 void startCommand(commonCommand*);//执行某个命令};
#include <iostream>using namespace std;void commonCommand::excuteCommand(){ cout<<"excute commonCommand"<<endl;}void CommandA::excuteCommand(){ cout<<"excute commandA"<<endl;}void CommandB::excuteCommand(){ cout<<"excute commandB"<<endl;}void commandQueue::addCommand(commonCommand* cmd_m)//往消息队列添加命令{ m_commandList.push_back(cmd_m);}void commandQueue::removeCommand(commonCommand* cmd_m)//删除消息队列里的某个命令{ m_commandList.remove(cmd_m); }void commandQueue::excuteAll()//遍历执行消息队列中的每个命令{ list<commonCommand*>::iterator i; for(i=m_commandList.begin();i!=m_commandList.end();i++) { (*i)->excuteCommand(); }}void commandQueue::eccuteCommand(commonCommand* cmd_m)//执行消息队列里的某个命令{ list<commonCommand*>::iterator i; for(i=m_commandList.begin();i!=m_commandList.end();i++) { if(*i==cmd_m) { (*i)->excuteCommand(); } }}void commandStarter::setCommandQueue(commandQueue* que_m)//添加消息队列{ m_Queue=que_m;}void commandStarter::startCommandAll()//执行所有命令{ m_Queue->excuteAll();}void commandStarter::startCommand(commonCommand* cmd_m)//执行某个命令{ m_Queue->eccuteCommand(cmd_m);}
调用文件:
int main(int argc, const char * argv[]) { // insert code here... commonCommand* commandA=new CommandA();//创建命令A commonCommand* commandB=new CommandB(); //创建命令B commandQueue* m_que=new commandQueue();//创建消息队列 m_que->addCommand(commandA);//往消息队列添加命令A m_que->addCommand(commandB);//往消息队列添加命令B m_que->addCommand(commandA);//往消息队列添加命令A // m_que->removeCommand(commandB);//删除消息队列里的命令B commandStarter* m_start=new commandStarter();//创建发令者 m_start->setCommandQueue(m_que);//给发令者添加消息队列 m_start->startCommandAll();//执行发令者消息队列里的所有命令 m_start->startCommand(commandB);//执行发令者消息队列里的B命令 return 0;}
输出:
excute commandA
excute commandB
excute commandA
excute commandB
1 0
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之--命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之--命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之命令模式
- 设计模式之 命令模式
- 关于安卓开发webview与js交互的问题
- 关于一段js中出现多次使用setInterval(出现计时累加)的问题
- android 指纹验证api
- java中HashSet浅析
- behemoth - 07
- 设计模式之命令模式
- 【CSS3】:read-write选择器
- Android 大牛开发者博客列表
- 用GCDWEBSERVER在手机上架HTTP SERVER
- iOS 各种类的架构图
- 论块元素与行内元素
- Android 4.4 Graphic Architecture
- Java Reflection(七):私有变量和私有方法
- Java内存模型