Command模式:
Command模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式的优点:第一、他能叫容易的设计一个命令队列;第二、在需要的情况下,可以较容易的将命令记入日志;第三、它允许接收请求的一方决定是否要否决请求;第四、可以容易的实现对请求的撤销和重做;第五、由于加进新的命令具体类不影响其他类,因此增加新的命令类很容易。还有最关键的一点:命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
Command模式的典型结构图为:
Command模式的实现代码如下:
//Reciever.h
#ifndef _RECEIEVER_H_
#define _RECEIEVER_H_
class Receiver
{
public:
Receiver();
~Receiver();
void Action();
protected:
private:
};
#endif //~_RECEIEVER_H_
//Receiver.cpp
#include "Receiver.h"
#include <iostream>
Receiver::Receiver()
{
}
Receiver::~Receiver()
{
}
void Receiver::Action()
{
std::cout<<"Receiver action......."<<std::endl;
}
//Invoker.h
#ifndef _INVOKER_H_
#define _INVOKER_H_
class Command;
class Invoker
{
public:
Invoker(Command* cmd);
~Invoker();
void Invoke();
protected:
private:
Command* _cmd;
};
#endif //~_INVOKER_H_
// Invoker.cpp
#include "Invoker.h"
#include "Command.h"
#define NULL 0
Invoker::Invoker(Command *pCommand)
: _cmd(pCommand)
{
}
Invoker::~Invoker()
{
delete _cmd;
_cmd = NULL;
}
void Invoker::Invoke()
{
if (NULL != _cmd)
{
_cmd->Execute();
}
}
//Command.h
#ifndef _COMMAND_H_
#define _COMMAND_H_
class Receiver;
class Command
{
public:
virtual ~Command();
virtual void Execute() = 0;
protected:
Command();
private:
};
class ConcreteCommand:public Command
{
public:
ConcreteCommand(Receiver* rev);
~ConcreteCommand();
void Execute();
protected:
private:
Receiver* _rev;
};
#endif //~_COMMAND_H_
// Command.h
#include "Command.h"
#include "Receiver.h"
#define NULL 0
#include <iostream>
Command::Command()
{
}
Command::~Command()
{
}
ConcreteCommand::ConcreteCommand(Receiver* pReceiver)
: _rev(pReceiver)
{
}
ConcreteCommand::~ConcreteCommand()
{
delete _rev;
_rev = NULL;
}
void ConcreteCommand::Execute()
{
if (NULL != _rev)
{
_rev->Action();
}
std::cout << "Execute by ConcreteCommand\n";
}
//main.cpp
#include "Command.h"
#include "Invoker.h"
#include "Receiver.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Receiver* rev = new Receiver();
Command* cmd = new ConcreteCommand(rev);
Invoker* inv = new Invoker(cmd);
inv->Invoke();
return 0;
}