命令模式是从界面设计中提取出来的一种分离耦合,提高重用的方法。被认为是最优雅而且简单的模式,它的应用范围非常广泛。
定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
组成:1.命令角色:( Command):声明执行操作的接口。抽象类实现。
2.具体命令角色(Concrete Command):将一个接收者对象绑定于一个运作;调用接收者相应的操作,以实现命令角色声明的执行操作的接口。
3.客户角色(Client):创建一个具体命令对象(并可以设定它的接收者)。
4.请求者角色(Invoker):调用命令对象执行这个请求。
5.接收者角色(Receiver):知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
实例:
Class Command{
public:
~virtual Command(){}
virtual Execute() = 0;
};
class Receiver{
public:
void Action(){
std::cout << "Receiver Action\n";
}
};
class Invoker{
public:
Invoker(Command *pCommand){}
~Invoker(){
delete m_pCommand;
m_pCommand = NULL;
}
void Invoker(){
if (NULL != m_pCommand)
{
m_pCommand->Execute();
}
}
private:
Command m_pCommand;
};
class ConcreteCommand:public Command
{
public:
ConcreteCommand(Receiver *pReceiver)
: m_pReceiver(pReceiver)
{}
virtual ~ConcreateComand()
{
delete m_pReceiver;
m_pReceiver = NULL;
}
virtual void Execute()
{
if (NULL != m_pReceiver)
{
m_pReceiver->Action();
}
std::cout << "Execute by ConcreateComand\n";
}
private:
Receiver* m_pReceiver;
};
void main(){
Receiver* pReceiver = new Receiver();
Command* pCommand = new ConcreateComand(pReceiver);
Invoker* pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
delete pInvoker;
}