一. 举例说明

我们知道,在多线程程序中,多个用户都给系统发 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. js数组的增删改查

    array 数组的增删改: push 从数组后面推入一个元素或多个元素 var arr = [1,2,3]; ​ // 返回:修改后数组的长度 arr.push(4,5,6); pop 删除数组最后一 ...

  2. js实现敲回车键登录

    任何一个网站页面都有登陆界面,很多时候在输入好用户名和密码后,还要用鼠标去点一个类似于登陆什么的按钮或者链接.这样你才能进网站做你喜欢做的事情. 有时候我就在想是不是能在输入好我该输入的东西后,直接敲 ...

  3. Springboot2.x整合RabbitMQ

    1.RabbitMQ介绍 可参照RabbitMQ笔记 2.接入配置 pom依赖 <!--amqp依赖--> <dependency> <groupId>org.sp ...

  4. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

  5. Go语言基础之net/http

    Go语言基础之net/http 2017年6月26日 Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HT ...

  6. linux目录化结构

    初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...

  7. ng的显示与隐藏

    显示与隐藏有很多中方法,但是在ng中有自己的显示与隐藏的方法 ng-if 或者[hidden] 在此主要介绍的是[hidden] 在ng中需要摒弃dom操作的方法,使用[hidden] 使用方法: e ...

  8. 【Tomcat】tomcat7 设置成系统服务启动

    1.启动cmd 2.cd C:\Program Files\tomcat7\bin 3.service.bat install 4.打开tomcat7w.exe可以启动管理服务

  9. js常用正则整理

    个人博客: http://mcchen.club //校验是否全由数字组成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.ex ...

  10. MYSQL SQL语句 之 select

    select语句在数据库操作中是操作频率最高的语句,使用方式也是多种多样,它的基本功能是:从表中选取数据,结果存储在一个结果集中.可以联合where,and,or,Order By,distinct, ...