命令模式
定义:
将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
适用性:
当有如下需求时,可以用命令模式:
1、 想抽象出待执行的动作以参数化某对象。命令模式是回调机制的一个面向对象的替代品。
2、 在不同的时刻指定,排列和执行请求。
3、 支持取消操作。
4、 支持修改日志。
5、 用构建在原语操作上的高层操作构造一个系统。
结构:

实现:
//命令接收者< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgYWxpZ249"left">class Receiver
{
public:
voiddoSomething()
{
cout<<"Receiver doSomething"<
}
};
//抽象的命令类
class Command
{
public:
virtual void Execute() {}
virtual ~Command(){}
};
//具体命令类
class ConcreteCommand1:public Command
{
public:
ConcreteCommand1(Receiver*pReceiver):m_pReceiver(pReceiver)
{ }
voidExecute()
{
cout<<"ConcreteCommand1 Execute"<
m_pReceiver->doSomething();
}
private:
Receiver *m_pReceiver;
};
class ConcreteCommand2:public Command
{
public:
ConcreteCommand2(Receiver*pReceiver):m_pReceiver(pReceiver)
{ }
voidExecute()
{
cout<<"ConcreteCommand2 Execute"<
m_pReceiver->doSomething();
}
private:
Receiver *m_pReceiver;
};
//调用者
class Invoker
{
public:
voidSetCommand(Command *pCommand)
{
m_pCommand = pCommand;
}
voidAction()
{
m_pCommand->Execute();
}
private:
Command *m_pCommand;
};
Invoker *pInvoker = new Invoker;
Receiver *pR = new Receiver;
Command *pCommand1 = new ConcreteCommand1(pR);
Command *pCommand2 = new ConcreteCommand2(pR);
pInvoker->SetCommand(pCommand1);
pInvoker->Action();
pInvoker->SetCommand(pCommand2);
pInvoker->Action();
