一. 举例说明

我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令。这里有几点需要说明:

1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数。

2. 用户并不需要知道别的用户的存在,也不管别人发不发命令,只管自己发命令,最后给结果即可。

3. 这些命令先是到了一个消息队列里面,然后由消息队列调用库函数。

结构图如下:

代码如下:

  1. class Command;
  2. //实施与执行类
  3. class Reciever
  4. {
  5. public:
  6. void Action()
  7. {
  8. cout<<"Do action !!"<<endl;
  9. }
  10. };
  11. //抽象命令类
  12. class Command
  13. {
  14. public:
  15. virtual ~Command() {}
  16. virtual void Excute() = 0;
  17. protected:
  18. Command() {}
  19. };
  20. //Read 命令
  21. class Read_Command:public Command
  22. {
  23. public:
  24. Read_Command(Reciever* rev)
  25. {
  26. this->_rev = rev;
  27. }
  28. ~Read_Command()
  29. {
  30. delete this->_rev;
  31. }
  32. void Excute()
  33. {
  34. cout<<"Read Command..."<<endl;
  35. _rev->Action();
  36. }
  37. private:
  38. Reciever* _rev;
  39. };
  40. //Write 命令
  41. class Write_Command:public Command
  42. {
  43. public:
  44. Write_Command(Reciever* rev)
  45. {
  46. this->_rev = rev;
  47. }
  48. ~Write_Command()
  49. {
  50. delete this->_rev;
  51. }
  52. void Excute()
  53. {
  54. cout<<"Write_Command..."<<endl;
  55. _rev->Action();
  56. }
  57. private:
  58. Reciever* _rev;
  59. };
  60. //要求命令执行的类
  61. class Invoker
  62. {
  63. public:
  64. Invoker(Command* cmd)
  65. {
  66. _cmd = cmd;
  67. }
  68. Invoker()
  69. {
  70. }
  71. ~Invoker()
  72. {
  73. delete _cmd;
  74. }
  75. //通知执行类执行
  76. void Notify()
  77. {
  78. list<Command*>::iterator it = cmdList.begin();
  79. for (it; it != cmdList.end(); ++it)
  80. {
  81. _cmd = *it;
  82. _cmd->Excute();
  83. }
  84. }
  85. //添加命令
  86. void AddCmd(Command* pcmd)
  87. {
  88. cmdList.push_back(pcmd);
  89. }
  90. //删除命令
  91. void DelCmd(Command* pcmd)
  92. {
  93. cmdList.remove(pcmd);
  94. }
  95. private:
  96. Command* _cmd;
  97. list<Command*> cmdList;
  98. };
  99. //测试代码
  100. int main(int argc,char* argv[])
  101. {
  102. Reciever* rev = new Reciever(); //定义一个执行类
  103. Command* cmd1 = new Read_Command(rev);//Read 命令
  104. Command* cmd2 = new Write_Command(rev);//Write 命令
  105. Invoker inv; //管理所有命令
  106. inv.AddCmd(cmd1);
  107. inv.AddCmd(cmd2);
  108. inv.Notify(); //通知执行类,执行
  109. inv.DelCmd(cmd1);
  110. inv.Notify();
  111. return 0;
  112. }

二. 命令模式

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

优点:

1. 它能比较容易地设计一个命令队列。

2. 在需要的情况下,可以较容易地将命令记入日志。

3. 允许接收请求的一方决定是否要否决请求。

4. 可以容易地实现对请求的撤销和重做。

5. 增加新的具体命令类很容易

6. 把请求一个操作的对象(Command)与知道怎么执行一个操作的对象(Receiver)分割开来。

设计模式C++描述----19.命令(Command)模式的更多相关文章

  1. 命令(Command)模式

    命令模式又称为行动(Action)模式或者交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可 ...

  2. 设计模式的征途—19.命令(Command)模式

    在生活中,我们装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或换气扇.在购买开关时,用户并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.换气扇并无 ...

  3. python 设计模式之命令(Command)模式

    #写在前面 也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化.比如在不同的类中加个第三者.哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得 ...

  4. 十五、命令(Command)模式--行为型模式(Behavioral Pattern)

    命令模式又称为行动(Action)模 式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派 ...

  5. 设计模式C++描述----21.解释器(Iterpreter)模式

    一. 解释器模式 定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子. 结构如下: 代码如下: //包含解释器之外的一些全局信息 class Conte ...

  6. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  7. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

  8. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  9. 设计模式C++描述----17.备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...

随机推荐

  1. 23种设计模式之模板方法(Template Pattern)

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 AbstractClass:抽象类.用来定义算法骨架和原语操作,在这个类里 ...

  2. 10秒钟理解react生命周期

    慎点!这是一篇很水很水的文章, 抄自react中文文档, 本文详细介绍了react生命周期函数执行顺序, 以及各生命周期函数的含义和具体作用. 不同阶段生命周期函数执行顺序 挂载(Mounting) ...

  3. Flask基础(05)-->路由的基本定义

    # 导入Flask from flask import Flask # 创建Flask的应用程序 app = Flask(__name__) # http://127.0.0.1:5000/123或者 ...

  4. ES6入门之Promise对象

    1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...

  5. 通俗易懂spring之singleton和prototype

    关于spring bean作用域,基于不同的容器,会有所不同,如BeanFactory和ApplicationContext容器就有所不同,在本篇文章,主要讲解基于ApplicationContext ...

  6. 项目二:企业级java电商网站开发(服务端)

    声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...

  7. 【故障公告】docker swarm 集群问题引发的故障

    我们的生产环境部署了 2 个 docker swarm 集群,集群 swarm-a 用于专门跑博客站点,集群 swarm-b 用于跑其他站点,manager 节点用了阿里云包月服务器,worker 节 ...

  8. ZGC深入学习

    ZGC简介 本次调研目标选取的是jdk11(long-term support)下首次亮相的zgc. zgc介绍简单翻译了zgc main page:ZGC简介 另外参考hotspot garbage ...

  9. django根据已有数据库表生成model类

    django根据已有数据库表生成model类 创建一个Django项目 django-admin startproject 'xxxx' 修改setting文件,在setting里面设置你要连接的数据 ...

  10. Oracle数据库提权(低权限提升至dba)

    0x01 Oracle存储过程”缺陷” 在 Oracle 的存储过程中,有一个有趣的特点:运行权限.运行权限分为两种,definer 和 invoker. definer 为函数创建者的权限,而 in ...