《大话设计模式》读书笔记之C++实现--chapter23命令模式

#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <QCoreApplication>
using namespace std;

//抽象接受命令类,执行命令
class AbstractReceiver{
public:
    virtual void ExcuteCommand() = 0;
    virtual ~AbstractReceiver(){}
};

//抽象命令类,有纯虚函数ExcuteCommand来执行命令
class AbstractCommand{
public:
    virtual void ExcuteCommand() = 0;
    virtual ~AbstractCommand(){}
};

//具体命令类,在构造函数中指定执行命令的receiver来执行命令
class ConcreteCommandOne:public AbstractCommand{
public:
    explicit ConcreteCommandOne(AbstractReceiver *receiver):m_pReceiver(receiver){}
    void ExcuteCommand()
    {
        m_pReceiver->ExcuteCommand();
        cout << "command is One" << endl;
    }
protected:
    AbstractReceiver* m_pReceiver;
};

class ConcreteCommandTwo:public AbstractCommand{
public:
    explicit ConcreteCommandTwo(AbstractReceiver *receiver):m_pReceiver(receiver){}
    void ExcuteCommand()
    {
        m_pReceiver->ExcuteCommand();
        cout << "command is two" << endl;
    }
protected:
    AbstractReceiver* m_pReceiver;
};

//具体命令接受者类,可执行不同的命令
class ConcreteReceiverOne:public AbstractReceiver{
public:
    void ExcuteCommand()
    {
        cout << "ConcreteReceiverOne excute command" << endl;
    }
};

//命令请求类,负责命令的设置,删除,记录及通知。
class Invoker{
public:
    void SetCommand(AbstractCommand* command)
    {
        m_CommandList.push_back(command);
    }
    void RemoveCommand(AbstractCommand* command)
    {
        m_CommandList.remove(command);
    }

    void Notify()
    {
        foreach (auto command, m_CommandList)
        {
            command->ExcuteCommand();
        }
    }
private:
    list<AbstractCommand *> m_CommandList;
};

int main(int argc,char** argv)
{
    AbstractReceiver* receiver = new ConcreteReceiverOne();         //指定一个命令执行者
    AbstractCommand* command1 = new ConcreteCommandOne(receiver);   //命令1指定命令执行者为receiver
    AbstractCommand* command2 = new ConcreteCommandTwo(receiver);   //命令2指定命令执行者为receiver
    Invoker invoker;
    invoker.SetCommand(command1);                                   //命令请求者设置命令请求
    invoker.SetCommand(command2);
    invoker.Notify();                                               //命令请求者通知所有命令,请求执行
    cout << "cancle command one" << endl;
    invoker.RemoveCommand(command1);                                //命令请求者设取消命令请求
    invoker.Notify();

    //删除指针
    if(command1 != nullptr)
    {
        delete command1;
        command1 = nullptr;
    }
    if(command2 != nullptr)
    {
        delete command2;
        command2 = nullptr;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wingwc/article/details/78258647