zoukankan      html  css  js  c++  java
  • [设计模式] 14 命令模式 Command

    Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到
    具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现
    者之间的解耦。

    在GOF的《设计模式:可复用面向对象软件的基础》一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请求拥有更多的能力;命令模式同样能够把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理。

    UML类图

    果冻想 | 一个原创文章分享网站
    Command:声明执行操作的接口;
    ConcreteCommand:将一个接收者对象绑定于一个动作,之后,调用接收者相应的操作,以实现Execute来完成相应的命令;
    Client:创建一个具体命令对象,但是并没有设定它的接收者;
    Invoker:要求该命令执行这个请求;
    Receiver:知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。

    以上这些对象是按照下面的方式进行协作的:

      1. Client创建一个ConcreteCommand命令对象,并指定它的Receiver对象;
      2. Invoker对象存储该ConcreteCommand对象;
      3. 该Invoker通过调用Command对象的Execute操作来提交一个请求。如果这个命令请求是可以撤销的,ConcreteCommand就执行Execute操作之前存储当前状态以用于取消该命令请求;
      4. ConcreteCommand对象调用Receiver的一些操作以执行该请求。
    #include <iostream>
    using namespace std;
    
    #define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
    
    class Receiver
    {
    public:
         void Action()
         {
              cout<<"Receiver->Action"<<endl;
         }
    };
    
    class Command
    {
    public:
         virtual void Execute() = 0;
    };
    
    class ConcreteCommand : public Command
    {
    public:
         ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver){}
         void Execute()
         {
              m_pReceiver->Action();
         }
    private:
         Receiver *m_pReceiver;
    };
    
    class Invoker
    {
    public:
         Invoker(Command *pCommand) : m_pCommand(pCommand){}
         void Invoke()
         {
              m_pCommand->Execute();
         }
    private:
         Command *m_pCommand;
    };
    
    int main()
    {
         Receiver *pReceiver = new Receiver();
         Command *pCommand = new ConcreteCommand(pReceiver);
         Invoker *pInvoker = new Invoker(pCommand);
         pInvoker->Invoke();
         SAFE_DELETE(pInvoker);
         SAFE_DELETE(pCommand);
         SAFE_DELETE(pReceiver);
         return 0;
    }
  • 相关阅读:
    实验
    概率与期望
    2020CSP-S模板
    洛谷:P2538 [SCOI2008]城堡
    洛谷P1731 生日蛋糕
    洛谷 P1180 石子合并
    洛谷 P2831 愤怒的小鸟
    浅谈状压DP
    浅谈线段树
    LCA-树链剖分
  • 原文地址:https://www.cnblogs.com/diegodu/p/4451300.html
Copyright © 2011-2022 走看看