命令模式是一种很巧妙很强大的设计模式,比如常见的操作系统里面的消息队列等消息发送机制都用到了命令模式,良好的命令模式设计主要解决以下两点,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