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

简介:

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

电视机是请求的接收者Receiver

遥控器是请求的发送者ConcreteCommand

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

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

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

  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

目录
相关文章
|
29天前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
59 0
|
1月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
26 0
|
16天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
20 1
|
27天前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
113 1
|
29天前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1
|
1月前
|
设计模式 存储 算法
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(三)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
24 0
|
1月前
|
设计模式 算法 搜索推荐
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(一)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
39 0
|
1天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
9 0
|
1天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
8 0
|
4天前
|
存储 安全 C语言
【C++】string类
【C++】string类

热门文章

最新文章