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

命令模式概述

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern) 

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

命令模式结构

Command

定义命令的接口,声明执行的方法。

ConcreteCommand

命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

Receiver

接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

Invoker

要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

Client

创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。

运作方式

①Client在C/C++中是主函数或者成员函数,它创建一个ConcreteCommand对象并指定他的Receiver对象
②某个Invoker对象存储该ConcreteCommand对象
③该Invoker通过调用Command对象的Execute操作来提交一个请求。若该命令是可撤销的,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令
④ConcreteCommand对象对调用它的Receiver的一些操作以执行该请求。

基本代码

看看命令接受者

命令接受者才是命令真正的执行者

[cpp] view plain copy print?

  1. // 命令的接受者,是真正执行命令的对象  
  2. class Receiver  
  3. {  
  4. public :  
  5.     virtual void Action()  
  6.     {  
  7.         std::cout <<"do something..." <<endl;  
  8.     }  
  9. };  
// 命令的接受者,是真正执行命令的对象
class Receiver
{
public :
    virtual void Action()
    {
        std::cout <<"do something..." <<endl;
    }
};

再看看命令接口

命令接口的实现对象,执行一个命令,
通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

[cpp] view plain copy print?

  1. // 命令的接口  
  2. class Command  
  3. {  
  4. public :  
  5.     virtual void Execute( ) = 0;        // 定义了一个执行的方法  
  6. };  
  7.   
  8. // 命令接口的实现对象,执行一个命令,  
  9. // 通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。  
  10. class ConcreteCommand : public  Command  
  11. {  
  12. public :  
  13.     ConcreteCommand(Receiver *receiver)  
  14.     {  
  15.        this->receiver = receiver;  
  16.     }  
  17.   
  18.     void Execute()  
  19.     {  
  20.   
  21.        //通常会转调接收者对象的相应方法,让接收者来真正执行功能  
  22.        receiver->Action();  
  23.   
  24.     }  
  25. protected:  
  26.     Receiver *receiver; // 内含一个命令接收者  
  27. };  
// 命令的接口
class Command
{
public :
    virtual void Execute( ) = 0;        // 定义了一个执行的方法
};

// 命令接口的实现对象,执行一个命令,
// 通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
class ConcreteCommand : public  Command
{
public :
    ConcreteCommand(Receiver *receiver)
    {
       this->receiver = receiver;
    }

    void Execute()
    {

       //通常会转调接收者对象的相应方法,让接收者来真正执行功能
       receiver->Action();

    }
protected:
    Receiver *receiver;	// 内含一个命令接收者
};

接着看看请求发送者

要求命令对象执行请求,
 通常会持有命令对象,可以持有很多的命令对象

[cpp] view plain copy print?

  1. // 要求命令对象执行请求,  
  2. // 通常会持有命令对象,可以持有很多的命令对象  
  3. class Invoker  
  4. {  
  5. public :  
  6.     void SetCommand(Command *command)  
  7.     {  
  8.        this->command = command;  
  9.     }  
  10.   
  11.     void RunCommand()  
  12.     {  
  13.         command->Execute();  
  14.     }  
  15. protected:  
  16.     Command *command;  
  17.   
  18. };  
// 要求命令对象执行请求,
// 通常会持有命令对象,可以持有很多的命令对象
class Invoker
{
public :
    void SetCommand(Command *command)
    {
       this->command = command;
    }

    void RunCommand()
    {
        command->Execute();
    }
protected:
    Command *command;

};

最后是客户端,也就是主程序

[cpp] view plain copy print?

  1. int main( )  
  2. {  
  3.     //创建接收者  
  4.     Receiver *receiver = new Receiver;  
  5.   
  6.     //创建命令对象,设定它的接收者  
  7.     Command *command = new ConcreteCommand(receiver);  
  8.   
  9.     //创建Invoker,把命令对象设置进去  
  10.   
  11.     Invoker *invoker = new Invoker;  
  12.     invoker->SetCommand(command);        // invoker发出command命令  
  13.     invoker->RunCommand( );              // 然后去执行这个命令  
  14.   
  15. }  
int main( )
{
    //创建接收者
    Receiver *receiver = new Receiver;

    //创建命令对象,设定它的接收者
    Command *command = new ConcreteCommand(receiver);

    //创建Invoker,把命令对象设置进去

    Invoker *invoker = new Invoker;
    invoker->SetCommand(command);		// invoker发出command命令
    invoker->RunCommand( );				// 然后去执行这个命令

}

好了我们在这里只是简单讲讲,命令模式的基础概念,以及基本代码实现。下一篇我们将用具体例子实现一下,方便大家理解

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

时间: 2024-09-14 22:59:31

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

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

  工作了一天感觉好累,洗了个澡,打开电视看看有没有喜欢的节目,拿起遥控器,看着上面的按钮,忽然感觉好奇妙,我们按一开机键,电视就开了,然后...哈哈,真好玩,我按我按.细想之下这不就是一个命令模式么. 电视机是请求的接收者Receiver, 遥控器是请求的发送者ConcreteCommand, 遥控器上有一些按钮,不同的按钮对应电视机的不同操作. 抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机.关闭电视机和切换频道. 显然,

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

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

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

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

设计模式之命令模式

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

【设计模式】—— 命令模式Commond

模式意图 将一个请求封装成一个对象,从而对这个命令执行撤销.重做等操作. 典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo.Redo等等. 另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作.这个机制也是java事件的处理方式. 应用场景 1 命令抽象成对象 2 在不同的时刻,指定或者排队命令 3 支持 Undo或者Redo等操作 4 修改日志,当系统崩溃时,利用修改日志执行撤销 5 原语操作上构造

php设计模式之命令模式使用示例

 这篇文章主要介绍了php设计模式之命令模式使用示例,命令模式将一个请求封装为一个对象,从而你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销操作 命令类: 1.命令角色:声明了一个给所有具体命令类的抽象接口.这是一个抽象角色. 2.具体命令角色:定义一个接受者和行为之间的弱耦合:实现execute方法,负责调用接受的相应操作.execute()方法通常叫做执行方法 3.客户角色:创建一个具体命令对象并确定其接受者. 4.请求者角色:负责调用命令对象执行请求,相关的方法叫

深入理解JavaScript系列(34):设计模式之命令模式详解

 这篇文章主要介绍了深入理解JavaScript系列(34):设计模式之命令模式详解,命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及执行可撤销的操作,需要的朋友可以参考下     介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及执行可撤销的操作.也就是说改模式旨在将函数的调用.请求和操作封装成一个单一的对象,然

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

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

php设计模式之命令模式的应用详解

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