#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;
}
《大话设计模式》读书笔记之C++实现--chapter23命令模式
最新推荐文章于 2024-10-09 09:25:49 发布