《大話設計模式》讀書筆記之C++實現--chapter23命令模式
阿新 • • 發佈:2019-02-16
#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;
}