命令模式C++实现

1定义

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求队列或者记录请求日志,可以提供命令的撤销和恢复功能

2类图

角色描述:

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

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

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

3实现

class Receiver

{

protected:

  Receiver();

public:

  virtual ~Receiver() = 0;

  virtual void doSomething()=0;

};

class ConcreteReceiver:public Receiver

{

public:

  void doSomething()

  {

    cout << "doSomething...."<<endl;  

  }

};

claas Command
{

protected:

  Command();

public:

  virtual ~Command() = 0;

  virtual void execute() = 0;

};

class ConcreteCommand:public Command

{

public:

  ConcreteCommand(Receiver* re)

    :_receiver(re)

  {}

  ~ConcreteCommand(){}

  void execute()

  {

    _receiver.doSomething();  

  }

protected:

  Receiver * _receiver;

};

class Invoke

{

private:

  Command * _cmd;

public:

  void setCommand(Command * cmd)

  {

    _cmd = cmd;

  }

  void action()

  {

    _cmd->execute();

  }

};

4应用

① 优点

类间解耦

可扩展性

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

②缺点

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

③使用场景

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

5扩展

①当一个命令需要多个接收者/执行者时,可以在命令内set多个接受者,完成通力合作的问题

②反悔问题,这个就设计备忘录模式了。或者通过反向链式存储机制得到前次记录,实现回滚。rollback

注:在项目中,约定的优先级最高,每个命令都是对一个或者多个接受者的封装。在项目中可以通过有意义的命名来实现Client和Receiver间的依赖描述

6 提升

可以将接受者在Command中进行封装以及默认的指定。从而命令的单一职责,与接受者无关 且  高层无需了解调用时的接受者是谁

最新文章

  1. Android开发之基于AndroidStudio环境搭建和工程创建
  2. gulp工具rename
  3. Delphi以及三方控件的源代码规模
  4. Back-propagation, an introduction
  5. 机器学习系列------1. GBDT算法的原理
  6. ajax for in eval()知识点的应用
  7. 《zw版&#183;Halcon-delphi系列原创教程》halconxlib控件列表
  8. 求平均排序MATLAB code
  9. Hibernate连接MySQL数据库乱码相关问题
  10. order by跟group by 跟having----------------sum() 求和   avg()求平均   count() 求个数--------------like
  11. 国都企信通短信平台发送手机短信的python脚本一例
  12. 深入剖析MFC中对于Windows消息处理、运行机制
  13. npm note
  14. Git添加远程报错:remote origin already exists.
  15. [Day18]集合框架Collection、迭代器、增强for循环以及泛型
  16. winfrom导出DataGridView为Excel方法
  17. (算法)构造MaxTree
  18. zookeeper_process内存泄露问题
  19. K-mean聚类算法汇聚有用信息——学习笔记
  20. ubuntu16.04 qt opencv3.4

热门文章

  1. 机器学习第7周-炼数成金-支持向量机SVM
  2. C++实现不能继承的类
  3. 深入跟踪MFC程序的执行流程
  4. windows计划任务定时运行synctoy的坑
  5. 一步一步学EF系列二【Fluent API的方式来处理实体与数据表之间的映射关系】
  6. 前端神器ws激活步骤
  7. 有界、无界队列对ThreadPoolExcutor执行的影响
  8. PHP中构造函数和析构函数解析
  9. python爬虫之新浪微博登录
  10. slf4j日志框架绑定机制