一. 举例说明

我们知道,在多线程程序中,多个用户都给系统发 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. java通过代理创建Conncection对象与自定义JDBC连接池

    最近学习了一下代理发现,代理其实一个蛮有用的,主要是用在动态的实现接口中的某一个方法而不去继承这个接口所用的一种技巧,首先是自定义的一个连接池 代码如下 import java.lang.reflec ...

  2. javascript中字符串对象常用的方法和属性

    前言 字符串是一种非常重要的数据类型,在Java等面向对象编程语言中,它代表对象类型,而在javascript中它却是一种基本数据类型,在开发的领域中,我们经常会碰到,无论是前端还是后台.比如后台验证 ...

  3. pandas.DataFrame的groupby()方法的基本使用

    pandas.DataFrame的groupby()方法是一个特别常用和有用的方法.让我们快速掌握groupby()方法的基础使用,从此数据分析又多一法宝. 首先导入package: import p ...

  4. PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 [转载]

    PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 2011-12-02 17:09:39|  分类: PHP|举报|字号 订阅     下载LOFTER我的照片书   ...

  5. ArcGIS Server服务扩展SOE应用场景

    何时需要使用SOE? 用自己的业务逻辑扩展ArcGIS Server • 分析超越了即拿即用的GP工具 • 功能超越了Esri Web APIS中包含的内容 • 通过其他方式细粒度的ArcObject ...

  6. [转] Julia 高性能动态编程语言入门

    本文共 851字,阅读大约需要 3分钟 ! 概 述 Julia 是一个 "全新"的高性能动态编程语言,前两天迎来了其 1.0 正式版的重大更新.Julia集 Python.C.R. ...

  7. 视频转换器 Wondershare Video Converter Ultimate v11.5.1 中文便携版

    Wondershare Video Converter Ultimate 是万兴公司出品的一款多功能音视频转换.DVD 刻录软件.视频下载软件.有了它,您可以随时随地观看.下载.编辑.转换.刻录视频, ...

  8. React 项目引入 Dva

    背景 现在手上在做的 React 项目因为年代久远,用的 Redux,写代码的体验不太好,所以想升级一下引入 dva.以往使用 dva 都是使用 dva-cli 直接生成 dva 项目,或者在使用 a ...

  9. OFD电子文档阅读器功能说明(采用WPF开发,永久免费)

    特别说明 ofd阅读器开发语言为c#,具有完全自主产权,没有使用第三方ofd开发包.可以根据你的需求快速定制开发.本阅读器还在开发完善阶段,如有任何问题,可以联系我QQ:13712486.博客:htt ...

  10. centos7 安装 mysql5.7 版本(全)

    centos 安装 版本说明 :centos7,mysql5.7 ,不是 centos7 可能有些命令不兼容 安装 mysql-server # 下载并安装 mysql yum wget -i -c ...