#include <iostream>
using namespace std;
#define DESTROY_POINTER(ptr) if (ptr) { delete ptr; ptr = NULL; }
class Receiver
{
public:
void Action1() { cout<<"Receiver::Action1"<<endl; }
void Action2() { cout<<"Receiver::Action2"<<endl; }
void Action3() { cout<<"Receiver::Action3"<<endl; }
};
class Command
{
public:
Command(Receiver* pReceiver) { m_pReceiver = pReceiver; }
virtual ~Command() { DESTROY_POINTER(m_pReceiver); }
virtual void Execute()=;
protected:
Receiver* m_pReceiver;
};
class ConcreteCommandA : public Command
{
public:
ConcreteCommandA(Receiver* pReceiver) : Command(pReceiver) {}
virtual void Execute() { m_pReceiver->Action1(); }
};
class ConcreteCommandB : public Command
{
public:
ConcreteCommandB(Receiver* pReceiver) : Command(pReceiver) {}
virtual void Execute() { m_pReceiver->Action2(); }
};
class ConcreteCommandC : public Command
{
public:
ConcreteCommandC(Receiver* pReceiver) : Command(pReceiver) {}
virtual void Execute() { m_pReceiver->Action3(); }
};
class Invoker
{
public:
Invoker(Command* pCommand) { m_pCommand = pCommand; }
~Invoker() { DESTROY_POINTER(m_pCommand); }
void Request() { m_pCommand->Execute(); }
private:
Command* m_pCommand;
};
int main(int argc, char *argv[])
{
Receiver* pReceiver = new Receiver;
Invoker invoker1(new ConcreteCommandA(pReceiver));
invoker1.Request();
Invoker invoker2(new ConcreteCommandB(pReceiver));
invoker2.Request();
Invoker invoker3(new ConcreteCommandC(pReceiver));
invoker3.Request();
return ;
}