C++设计模式10--命令模式(二)(Command)--降低请求发送者与接收者耦合

  工作了一天感觉好累,洗了个澡,打开电视看看有没有喜欢的节目,拿起遥控器,看着上面的按钮,忽然感觉好奇妙,我们按一开机键,电视就开了,然后...哈哈,真好玩,我按我按。细想之下这不就是一个命令模式么。

电视机是请求的接收者Receiver,

遥控器是请求的发送者ConcreteCommand,

遥控器上有一些按钮,不同的按钮对应电视机的不同操作。

抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。

显然,电视机遥控器就是一个典型的命令模式应用实例。

[cpp] view plain copy print?

  1. #include <iostream>  
  2. #include <vector>  
  3. using std::cout;  
  4. using std::endl;  
  5. using std::vector;  
  6. using namespace std;  
  7. /* 
  8. 电视机是请求的接收者, 
  9.     也只有它的内部有一堆指令集合可以执行各种命令,它才是命令的真正执行者 
  10.     因此它有Open打开电视, Close关闭电视,Change更换频道的接口 
  11. 遥控器是请求的发送者, 
  12.     它内含命令的对象, 
  13.     负责将这个命令发送出去,因此需要有设置命令的接口,相当于人按下遥控器的按钮 
  14.     内含RunCommand运行命令的接口,它调用了命令接口的Execute执行函数 
  15.  
  16. 遥控器上的那些按钮, 
  17.     不同的按钮对应电视机的不同操作。 
  18.     抽象命令角色由一个命令接口来扮演, 
  19.     有三个具体的命令类实现了抽象命令接口, 
  20.     这三个具体命令类分别代表三种操作: 
  21.     打开电视机、关闭电视机和切换频道。 
  22.  
  23. 显然,电视机遥控器就是一个典型的命令模式应用实例。 
  24. */  
  25.   
  26.   
  27.   
  28.   
  29. // 接收者对象, 电视才是真正命令的执行者  
  30. class Television  
  31. {  
  32. public :  
  33.     void Open( )       // 打开电视  
  34.     {  
  35.         std::cout <<"打开电视" <<std::endl;  
  36.     }  
  37.   
  38.     void Close( )      // 关闭电视  
  39.     {  
  40.         std::cout <<"关闭电视" <<std::endl;  
  41.     }  
  42.   
  43.     void Change( )     // 切换频道  
  44.     {  
  45.         std::cout <<"更换频道" <<std::endl;  
  46.     }  
  47. };  
  48.   
  49.   
  50. class Command  
  51. {  
  52. public :  
  53.     virtual void Execute( ) = 0;         // 执行的接口  
  54. };  
  55.   
  56. // 打开电视的命令  
  57. class OpenCommand : public Command  
  58. {  
  59. public :  
  60.     OpenCommand(Television *tv)  
  61.     {  
  62.         m_tv = tv;  
  63.     }  
  64.   
  65.     void Execute( )         // 执行的接口  
  66.     {  
  67.         //std::cout <<"打开电视" <<std::endl;  
  68.         m_tv->Open( );  
  69.     }  
  70. protected :  
  71.     Television *m_tv;  
  72. };  
  73.   
  74. // 关闭电视的命令  
  75. class CloseCommand : public Command  
  76. {  
  77. public :  
  78.     CloseCommand(Television *tv)  
  79.     {  
  80.         m_tv = tv;  
  81.     }  
  82.     void Execute( )         // 执行的接口  
  83.     {  
  84.         //std::cout <<"关闭电视" <<std::endl;  
  85.         m_tv->Close( );  
  86.     }  
  87. protected :  
  88.     Television *m_tv;  
  89. };  
  90.   
  91. // 更换频道的命令  
  92. class ChangeCommand : public Command  
  93. {  
  94. public :  
  95.     ChangeCommand(Television *tv)  
  96.     {  
  97.         m_tv = tv;  
  98.     }  
  99.     void Execute( )         // 执行的接口  
  100.     {  
  101.         //std::cout <<"更换频道" <<std::endl;  
  102.         m_tv->Change( );  
  103.     }  
  104. protected :  
  105.     Television *m_tv;  
  106. };  
  107.   
  108. // Invoker请求发送者  
  109. // 要求命令对象执行请求,  
  110. // 通常会持有命令对象,可以持有很多的命令对象  
  111. class Control  
  112. {  
  113. public :  
  114.     void SetCommand(Command *command)  
  115.     {  
  116.        this->m_command = command;  
  117.     }  
  118.   
  119.     void RunCommand( )  
  120.     {  
  121.         m_command->Execute();  
  122.     }  
  123.   
  124. protected:  
  125.     Command *m_command;  
  126.   
  127. };  
  128.   
  129. // 主程序其实就相当于我们人  
  130. int main( )  
  131. {  
  132.     // 我们手里有一个遥控器  
  133.     Control *control = new Control;  
  134.   
  135.     // 家里有一个大彩电  
  136.     Television *tv = new Television;  
  137.   
  138.     /// 首先我们打开电视机  
  139.     // 创建一个打开的命令, 这个命令只操纵tv这个对象  
  140.     Command *openCommand = new OpenCommand(tv);  
  141.     control->SetCommand(openCommand);  
  142.     control->RunCommand( );  
  143.     delete openCommand;  
  144.   
  145.   
  146.     // 换了好久频道也没找到好看的, 郁闷的关掉电视机  
  147.     // 创建一个更换频道的命令,这个命令只操纵tv这个对象  
  148.     Command *changeCommand = new ChangeCommand(tv);  
  149.     control->SetCommand(changeCommand);  
  150.     control->RunCommand( );  
  151.     delete changeCommand;  
  152.   
  153.     // 换了好久频道也没找到好看的, 郁闷的关掉电视机  
  154.     // 创建一个关闭的命令, 这个命令只操纵tv这个对象  
  155.     Command *closeCommand = new CloseCommand(tv);  
  156.     control->SetCommand(closeCommand);  
  157.     control->RunCommand( );  
  158.     delete closeCommand;  
  159.   
  160.     delete tv;  
  161.     delete control;  
  162.     return 0;  
  163. }  

转载:http://blog.csdn.net/gatieme/article/details/18044097

时间: 2024-12-29 15:10:05

C++设计模式10--命令模式(二)(Command)--降低请求发送者与接收者耦合的相关文章

C++设计模式10--命令模式(一)--降低请求发送者与接收者耦合

命令模式概述 在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,实现二者之间的松耦合.这就是命令模式(Command Pattern)    工作了一天感觉好累,洗了个澡,打开电视看看有没有喜欢

Java设计模式之命令模式(Command模式)介绍_java

Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse. Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句

设计模式:命令模式(Command)

 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以支持可撤销的操作. 命令模式的角色 1. 客户端角色(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者. 2. 命令角色(Command):声明一个给所有命令类的抽象接口. 3. 具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合:实现execute()方法,负责调用接收者的相应操作.execute()方法叫做执行方法. 4. 请求者角

C++设计模式之命令模式_C 语言

前言 又要过年了,又是一个抢票季:从大学起,到现在工作,一直都是在外地,离家千里:以前买票,曾经也去火车站通宵排队买票:直到12306的腾空出现,在电脑前不停止的点着鼠标刷票,那个时候12306很是脆弱,抢一张票更是难上加难:现在好了,慢慢强大的12306,买票时出现了一个排队系统,先买票,进入12306的排队系统:然后,系统一个一个的处理大家的请求,一旦你的购票请求进入了排队系统,你就无法再次进行刷票了,除非你退出排队系统:这就减少了购票者的刷票次数:减少了12306后台服务器的处理压力.那么

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.  例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不

乐在其中设计模式(C#) - 命令模式(Command Pattern)

原文:乐在其中设计模式(C#) - 命令模式(Command Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd 介绍 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例 有一个Message实体类,某个类对它的操作有Insert()和Delete()方法.现在要求可以对之前的所有操作做撤销和重复. MessageModel using Sys

.NET设计模式-命令模式(Command Pattern)

命令模式(Command Pattern) --.NET设计模式系列之十七 TerryLee,2006年7月 概述 在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李

设计模式之命令模式

        在日常生活中,我们常常会遇到这样一些问题:需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.        命令模式是非常实用的一个模式,比如最常用的就是我们编写项目中用到的撤销\恢复(Undo\Redo)就是通过命令模式(Command)来实现的;在如我们的计算器.小孩通过遥控器控制赛车运动,

第14章 命令模式(Command Pattern)

原文 第14章 命令模式(Command Pattern) 命令模式(Command Pattern)       概述         在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实