设计模式之命令模式

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

};


.cpp 文件

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值