首页 > 其他分享 >命令模式

命令模式

时间:2023-12-20 15:59:05浏览次数:29  
标签:void pCommand 模式 命令 pRemote new pLight public

#include <iostream>
#include <vector>
using namespace std;

class Light {
public:
    void on() {
        cout << "灯亮了" << endl;
    }
    void off() {
        cout << "灯灭了" << endl;
    }
};
//turn on the light
//turn off the light

//抽象出一个类,专门记录,这个动作
class Command {
public:
    virtual void execute() = 0;
    virtual void undo() = 0;
protected:
    Command(){}
};

//具体的命令对象:就是用来开灯
//持有一个Receiver的实例,让这个Receiver自己去处理自己的运行
class LightOnCommand :public Command{
//突出的一个特点:我们问题聚焦的是如何规划“请求这个动作”
//而这个动作的真正执行,是通过我们将真实设备组合进入这个ConcreteCommand里面来的(LightOnCommand)
public:
    LightOnCommand(Light *pLight) :m_pLight(pLight) {
    }
    void execute() {
        m_pLight->on();
    }
    void undo() {
        m_pLight->off();
    }
private:
    Light *m_pLight;
};

//添加一个undo的命令
class LightOffCommand : public Command {
public:
    LightOffCommand(Light *pLight) : m_pLight(pLight) {

    }
    void execute() {
        m_pLight->off();
    }
    void undo() {
        m_pLight->on();
    }
private:
    Light* m_pLight;
};
//增加一个空的命令状态
class NoCommand :public Command {
public:
    void execute() {}
    void undo() {}
};

//invoker可以触发任意的命令对象,invoker可以发任何命令
class SimpleRemoteControl {
public:
    void setCommand(Command *pCommand) {
        m_pCommand = pCommand;

        //增加Undo的能力
        m_pUndoCommand = new NoCommand;

    }

    //////现在当前的这个命令对象,既可以关闭,也可以打开,所以我们进一步细化buttonPress
    /*void buttonPressed() {
        m_pCommand->execute();
    }*/

    void onButonWasPushed() {
        m_pCommand->execute();
        m_pUndoCommand = m_pCommand;
    }

    void offButtonWasPushed() {
        m_pCommand->execute();
        m_pUndoCommand = m_pCommand;
    }

    void undoButtonWasPushed() {
        m_pUndoCommand->undo();
    }
private:
    Command* m_pCommand;
    //增加Undo撤销的能力
    Command* m_pUndoCommand;
};

//宏命令
class MacroCommands :public Command {
public:
    MacroCommands(vector<Command*> Commands) :m_Commands(Commands) {

    }
    void execute() {
        for (vector<Command*>::iterator iter = m_Commands.begin();iter != m_Commands.end();iter++) {
            (*iter)->execute();
        }
    }
    void undo() {
        for (vector<Command*>::iterator iter = m_Commands.begin();iter != m_Commands.end();iter++) {
            (*iter)->undo();
        }
    }
private:
    vector<Command*> m_Commands;
};
//为了演示,再次加入若干命令
class Sound {
public:
    void on() {
        cout << "声音设备打开了" << endl;
    }
    void off() {
        cout << "声音设备关闭了" << endl;
    }
};

class SoundOnCommand : public Command {
public:
    SoundOnCommand(Sound *pSound) :m_pSound(pSound) {
    }
    void execute() {
        m_pSound->on();
    }
    void undo() {
        m_pSound->off();
    }
private:
    Sound *m_pSound;
};

//能够批量执行命令的loader
class SimpleRemoteControlLoader {
public:
    void setCommand(Command *pCommand) {
        m_pCommand = pCommand;
    }

    void onCommandsStart() {
        m_pCommand->execute();
    }

    
private:
    Command* m_pCommand;
    
};


int main(void) {
    SimpleRemoteControl* pRemote = new SimpleRemoteControl;
    Light* pLight = new Light;
    LightOnCommand* pLightOn = new LightOnCommand(pLight);//首先将设备组合进入命令对象
    pRemote->setCommand(pLightOn);//通过Invoker触发,“请求”动作
    pRemote->onButonWasPushed();//按下开启
    pRemote->undoButtonWasPushed();//实现Undo
    //加载关灯命令
    LightOffCommand* pLightOff = new LightOffCommand(pLight);
    pRemote->setCommand(pLightOff);
    pRemote->offButtonWasPushed();
    pRemote->undoButtonWasPushed();

    //宏命令的演示
    cout << "**************宏命令的演示" << endl;
    vector<Command*> myCommands;
    Sound* pSound = new Sound;
    SoundOnCommand* pSoundOn = new SoundOnCommand(pSound);
    myCommands.push_back(pLightOn);
    myCommands.push_back(pSoundOn);

    MacroCommands* pMacroCommands = new MacroCommands(myCommands);
    //pRemote->setCommand(pMacroCommands);现在我们需要批量的执行宏命令,新增一个RemoteInvoker的宏命令执行方法
    SimpleRemoteControlLoader *pRemoteCommands = new SimpleRemoteControlLoader;
    pRemoteCommands->setCommand(pMacroCommands);
    pRemoteCommands->onCommandsStart();
    //pRemote->buttonPressed();
    //灯亮了被我们的invoker:SimpleRemote隐藏起来了,(封装了设备)
    //接下来,只要我们关注invoker,并且invoker进行控制,就能把一系列的“动作”记录下来
    system("pause");
    return 0;
}
示例1

 

标签:void,pCommand,模式,命令,pRemote,new,pLight,public
From: https://www.cnblogs.com/zeliangzhang/p/17916650.html

相关文章

  • docker常用命令日志记录(二)
    1.拉取镜像dockerpullnginx2.查看镜像 dockerimages[root@VM-8-2-centos~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEnginxlatest605c77e624dd24monthsago141MB3.保存镜像为一个压缩包dockersave[root@V......
  • docker网络模式
    Docker网络我们使用容器,不单是运行单机程序,当然是需要运行网络服务在容器中,那么如何配置docker的容器网络,基础网络配置,网桥配置,端口映射,还是很重要。docker网络功能docker的网络功能就是利用Linux的networknamespace,networkbridge,虚拟网络设备实现的。默认情况下,docker安装......
  • 小谈设计模式(26)—中介者模式
    (小谈设计模式(26)—中介者模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。中介者模式中介者模式(MediatorPattern)是一种行为型设计模式,它通过将对象之间的通信......
  • 设计模式—代理模式
    介绍代码接口创建接口ImagepublicinterfaceImage{voiddisplay();}实体类创建实体类RealImagepublicclassRealImageimplementsImage{privateStringfileName;publicRealImage(StringfileName){this.fileName=fileName;......
  • ElasticSearch 命令执行漏洞
    漏洞编号:CVE-2014-3120漏洞详情CVE编号CVE-2014-3120漏洞级别中危6.8标题Elasticsearch默认配置允许动态脚本执行漏洞披露时间2014/07/29漏洞总结Elasticsearch1.2版本及之前的默认配置启用了动态脚本,攻击者可以通过_search的source参数执行任意MVEL表达式和......
  • 设计模式—观察者模式
    介绍代码观察者父类只有一个属性subject表示订阅的主题。update方法用于更新观察者本身publicabstractclassObserver{protectedSubjectsubject;publicabstractvoidupdate();}主题类主题类Subject直到自己的订阅者们,每当主题状态改变的时候就......
  • 组合模式揭秘:如何构建可扩展的树形结构
    什么是组合模式组合模式(CompositePattern)是一种结构型设计模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的关系。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。组合模式的核心原理组合模式......
  • Python实现软件设计模式6:单例模式 Singleton Pattern
    动机针对某个类,为了保证系统中只创建一个示例,并且易于被访问(例如操作系统的任务管理器,软件的登陆注册界面)自行创建这个实例,无法从外部创建这个实例,向系统提供这个实例饿汉式单例Java版本在类加载的时候,就创建对象,如果后续得不到使用,可能会造成内存资源浪费懒汉式单......
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩
    ......
  • Python实现软件设计模式5:原型模式 Prototype Pattern
    动机对象的克隆问题,想要复制出本对象的一个副本,属性方法一模一样从需求上来说,先快速克隆对象,后续根据需求再进行对象局部属性的修改区分为深克隆和浅克隆两个版本,默认为浅克隆角色Prototype抽象原型类ConcretePrototype具体原型类Client客户类浅克隆与深克隆......