命令模式

来源:互联网 发布:易语言调用js脚本 编辑:程序博客网 时间:2024/06/05 12:39

简介

命令模式:

将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销操作。

类图

 

组成对象

Receiver接受者角色,就是干活的码农,命令传递打这里就应该被执行。

Command命令角色,对命令额封装,所有命令声明在此

Invoker调用者角色,接受到命令并且执行命令

常用的场景

只要认为是命令的地方,eg  GUI开发,按钮,DOS命令模拟,触发反馈机制的处理等

优点:

1.类间解耦

2.可扩展性

3.结合其他模式更加优秀:结合责任链模式实现命令族解析任务;结合模板方法,减少Command子类的膨胀

缺点:

1. 命令越多,类约膨胀,需要慎用

测试代码

 

#include <iostream>#include <assert.h>#include <vector>using namespace std;#include <string>#include <list>class FBaseReciever{public:virtual void dosomething() = 0;};class FFirstReviever : public FBaseReciever{public:void dosomething(){};};class FBaseCommand{private:FBaseReciever* m_pReciever;public:FBaseCommand(FBaseReciever* receiver){m_pReciever = receiver;};FBaseCommand(){};~FBaseCommand(){};virtual void execute() = 0;};class FConcretaCommand : public FBaseCommand{public:void execute(){};};class FInvoker{public:void setCommand(FBaseCommand* command){m_pCommand = command;};void executeCommand(){assert(m_pCommand);m_pCommand->execute();};private:FBaseCommand* m_pCommand;};void main(){FConcretaCommand* pComand = new FConcretaCommand();FInvoker oInvoker;oInvoker.setCommand(pComand);oInvoker.executeCommand();delete pComand;}

原创粉丝点击