设计模式C++实现笔记

Command 命令模式(行为模式)

2019-03-01  本文已影响0人  lixin_karl

介绍

  命令模式:将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。

参与者

代码

class ReceiverA {//Receiver
public:
    void  doSomthing() {
        std::cout<<"DO A"<<std::endl;
    }
};

class ReceiverB {//Receiver
public:
    void  doSomthing() {
        std::cout<<"DO B"<<std::endl;
    }
};


class ICommand{//命令对象基类 Command
public:
    virtual ~ICommand(){}
    virtual void Execute() = 0;
};

class CommandA : public  ICommand{//ConcreteCommand 
public:
    explicit CommandA(ReceiverA *a):rec(a){}
    void Execute() override {
        rec->doSomthing();
    }
private:
    ReceiverA *rec;
};
class CommandB : public  ICommand{//ConcreteCommand 
public:
    explicit CommandB(ReceiverB *a):rec(a){}
    void Execute() override {
        rec->doSomthing();
    }
private:
    ReceiverB *rec;
};


class Invoker{//Invoker
public:
    void Add(int index,ICommand *cmd){
        command_m.insert(std::make_pair(index,cmd));
    }
    void Remove(int index){
        command_m.erase(index);
    }
    void DoCmd(int i){
        auto it = command_m.find(i);
        if(command_m.end() != it)
        {
            it->second->Execute();
        }
    }
private:
    std::map<int,ICommand *> command_m;
};

int main()//Client
{
    Invoker invoker;
    ICommand *cmd1 = new CommandA(new ReceiverA);
    ICommand *cmd2 = new CommandB(new ReceiverB);
    invoker.Add(1,cmd1);
    invoker.Add(2,cmd2);
    invoker.DoCmd(2);
    invoker.DoCmd(1);
    invoker.DoCmd(4);
    invoker.DoCmd(2);
}

输出

DO B
DO A
DO B

特点

参考

上一篇 下一篇

猜你喜欢

热点阅读