• 设计模式--命令模式C++实现


    命令模式C++实现

    1定义

    将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求队列或者记录请求日志,可以提供命令的撤销和恢复功能

    2类图

    角色描述:

    Receiver接受者角色,就是干活的码农,命令传递打这里就应该被执行。

    Command命令角色,对命令额封装,所有命令声明在此

    Invoker调用者角色,接受到命令并且执行命令

    3实现

    class Receiver

    {

    protected:

      Receiver();

    public:

      virtual ~Receiver() = 0;

      virtual void doSomething()=0;

    };

    class ConcreteReceiver:public Receiver

    {

    public:

      void doSomething()

      {

        cout << "doSomething...."<<endl;  

      }

    };

    claas Command
    {

    protected:

      Command();

    public:

      virtual ~Command() = 0;

      virtual void execute() = 0;

    };

    class ConcreteCommand:public Command

    {

    public:

      ConcreteCommand(Receiver* re)

        :_receiver(re)

      {}

      ~ConcreteCommand(){}

      void execute()

      {

        _receiver.doSomething();  

      }

    protected:

      Receiver * _receiver;

    };

    class Invoke

    {

    private:

      Command * _cmd;

    public:

      void setCommand(Command * cmd)

      {

        _cmd = cmd;

      }

      void action()

      {

        _cmd->execute();

      }

    };

    4应用

    ① 优点

    类间解耦

    可扩展性

    结合其他模式更加优秀:结合责任链模式实现命令族解析任务;结合模板方法,减少Command子类的膨胀

    ②缺点

    命令越多,类约膨胀,需要慎用

    ③使用场景

    只要认为是命令的地方。eg  GUI 开发,按钮,DOS命令模拟,触发反馈机制的处理等

    5扩展

    ①当一个命令需要多个接收者/执行者时,可以在命令内set多个接受者,完成通力合作的问题

    ②反悔问题,这个就设计备忘录模式了。或者通过反向链式存储机制得到前次记录,实现回滚。rollback

    注:在项目中,约定的优先级最高,每个命令都是对一个或者多个接受者的封装。在项目中可以通过有意义的命名来实现Client和Receiver间的依赖描述

    6 提升

    可以将接受者在Command中进行封装以及默认的指定。从而命令的单一职责,与接受者无关 且  高层无需了解调用时的接受者是谁

  • 相关阅读:
    Git 码云操作
    多线程基础必要知识点!看了学习多线程事半功倍(转)
    Spring技术内幕:设计理念和整体架构概述(转)
    单例模式你会几种写法?(转)
    Linux-看完这篇Linux基本的操作就会了(转)
    每天一个linux命令9之crontab 定时任务
    在linux下给grep命令添加颜色
    springmvc使用StringHttpMessageConverter需要配置编码
    MySQL 中的 base64 函数
    spirng整合rmi
  • 原文地址:https://www.cnblogs.com/lang5230/p/5328005.html
Copyright © 2020-2023  润新知