首页 > 其他分享 >设计模式-命令模式

设计模式-命令模式

时间:2023-08-26 14:44:35浏览次数:32  
标签:include pstInvoke vecPstCommand void 模式 命令 Command pstReceiver 设计模式

命令模式

模式定义

  • 命令模式是一种行为定义模式,可以将请求转换成一个与请求相关的,包含该请求所有信息的独立对象,并且能够根据不同请求将方法参数化,延迟请求执行或者将其放入到队列中且能实现撤销等操作

模式动机

  • 敏捷开发的原则要求,不要在代码上添加基于猜测的,实际上不需要的功能。如果不清楚一个系统是否需要命令模式,一般不要急着去实现它,事实上,在需要的时候通过重构实现这个模式并不难,只有在真正需要撤销/恢复操作功能的时候,将原有的代码重构为命令才合适

UML 类图

代码实例

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
using namespace std;

class Receiver
{
public:
    void BakeMutton(){
        cout << "Bake mutton..." << endl;
    }
    void BakeChicken(){
        cout << "Bake chicken..." << endl;
    }
};

class Command
{
public:
    Command(Receiver* pstRecevier):m_pstReceiver(pstRecevier){}
    virtual void Excute() = 0;
protected:
    Receiver* m_pstReceiver;
};

class ConcreteCommandA : public Command
{
public:
    ConcreteCommandA(Receiver* pstReceiver):Command(pstReceiver){

    }

    virtual void Excute(){
        cout << "ConcreteCommandA excuting..." << endl;
        m_pstReceiver->BakeMutton();
    }
};

class ConcreteCommandB : public Command
{
public:
    ConcreteCommandB(Receiver* pstReceiver):Command(pstReceiver){

    }

    virtual void Excute(){
        cout << "ConcreteCommandB excuting..." << endl;
        m_pstReceiver->BakeChicken();
    }
};

class Invoke{
public:
    void Add(Command* pstCommand){
        m_vecPstCommand.push_back(pstCommand);
    }
    void Remove(Command* pstCommand){
        m_vecPstCommand.erase(find(m_vecPstCommand.begin(), m_vecPstCommand.end(),pstCommand));
    }
    void RemoveAll(){
        m_vecPstCommand.clear();
    }
    void Notify(){
        for(typeof(m_vecPstCommand.begin()) it = m_vecPstCommand.begin(); it != m_vecPstCommand.end(); it++){
            (*it)->Excute();
        }
    }
private:
    vector<Command*> m_vecPstCommand;
};

int main()
{
    Receiver* pstReceiver = new Receiver;
    Command* pstConcreteCommandA = new ConcreteCommandA(pstReceiver);
    Command* pstConcreteCommandB = new ConcreteCommandB(pstReceiver);
    Invoke* pstInvoke = new Invoke();

    pstInvoke->Add(pstConcreteCommandA);
    pstInvoke->Add(pstConcreteCommandA);
    pstInvoke->Add(pstConcreteCommandB);
    pstInvoke->Notify();

    cout << "-----------First Call End---------" << endl;

    pstInvoke->Remove(pstConcreteCommandA);
    pstInvoke->Remove(pstConcreteCommandB);
    pstInvoke->Notify();

    cout << "-----------Second Call End---------" << endl;

}

优缺点

优点:

  1. 类间解耦,调用者和接收者没有没有直接耦合,调用这只需要调用 Command 的方法执行接收者的业务逻辑即可
  2. 可扩展性,如果 Command 需要扩展,只需要新增一个子类即可

缺点

  1. 如果命令很多,则意味着 Command 子类很多,增加了系统的复杂性

标签:include,pstInvoke,vecPstCommand,void,模式,命令,Command,pstReceiver,设计模式
From: https://www.cnblogs.com/wanghao-boke/p/17658786.html

相关文章

  • 磁盘配置的3种模式
    磁盘置备的3种模式,工作中在VMwareEsxi上虚拟服务器配置虚拟硬件、威联通NAS磁盘配置上遇到过。下面介绍一下这3种模式 所谓磁盘置备,就是磁盘空间分配的技术。精简置备厚置备(延迟置零):假如说新分配的硬盘上有数据存在,配置完后硬盘上有新数据产生时,新数据会逐渐覆盖硬盘上的旧......
  • 【面试宝典】Git 版本控制常用命令
    一.Git概述Git是目前世界上最先进的分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、xml文件、html页面等),包括:代码回溯:Git在管理文件过程中会记录日志,方便回退到历史版本版本切换:Git存在分支的概念,一个项目可以有多个分支(版本),可以任意切换多人协作:Git支......
  • Linux命令
     文章目录1.用户管理2.磁盘管理3.文件管理4.进程管理a.查看进程b.服务管理c.后台运行(守护进程)d.启动项5.软件管理a.rpm包之手动安装b.rpm包之yum安装c.源代码安装d.二进制安装6.防火墙a.netflter/iptables功能b.iptables:“五表五链”c.fi......
  • Allure常用命令
    命令格式:allure [option]  [command]  [commandoptions]allure--help帮助allure--version查看版本信息allureserve 生成在线版本的测试alluregenerate<allure-result中间文件> -o  输出目录(默认路径:allure-report)引入依赖<?xmlversion="1.0"e......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 在线教育知识付费系统源码,解码不同模式
    在当今社会,知识付费如风一般掀起了热潮,成为了许多人关注的焦点。但对于知识付费究竟是什么,有些人可能还不太了解。让我用一条短视频来为你解开这个谜题。 首先,我们有一种模式,被戏称为“贩卖焦虑”。这种模式常常针对低认知人群,以制造焦虑的方式吸引他们购买知识产品。这或许不......
  • 观察者模式-21
    概述观察者模式(ObserverPattern)又称发布-订阅(Publish/Subscribe)模式、模型视图(Model/View)模式、源监听器(Source/Listener)模式、从属者(Dependents)模式。它定义了对象之间的一对多的关系,使得一个对象的状态发生改变时,会通知相关的其他对象并根据变化的状态更新这些对象。优点:实现......
  • git_使用git worktree命令使不同分支的代码文件可以同步运行
    情景再现:我本地代码正在开发后台系统的过程中,前台开发的同事时不时地会来找我要IP地址,使用正在开发的后台管理系统来进行一些数据的增删改查.这个时候直接提供正在开发的版本的开发服务器地址是不行的,因为随着代码的编写时不时的报个bug是家常便饭,对于使用者来说非常......
  • [20230825]dc命令复杂学习.txt
    [20230825]dc命令复杂学习.txt--//前几天学习dc使用,我当时最后举了一个累加的例子,里面--//-e后面那一串什么意思,即使看了mandc文档,我当时也没看懂表示什么意思.尝试看了man文档,简单解析如下:--//我从文档里面取出相关说明:[characters]Makesastringcontainingcharacters......