[设计模式]Command命令模式

来源:互联网 发布:软件使用手册标准 编辑:程序博客网 时间:2024/05/16 18:43

command命令模式

Command模式通过将请求封装到一个对象(Command)中,并将请求的接收者存放到具体的ConcreteCommand类中的(reciver)中,从而实现调用操作的对象和操作的具体实现之间的解耦。

解析:Command模式的思想是把命令封装在一个类(Command)中,同时把接收对象也封装在一个类(Receive)中,由调用这个命令的类(Invoker)来调用。其实,如果弄清楚了Command模式的原理,就会发现其实它和注册回调函数的原理很相似,而在面向过程的设计中的回调函数其实和这里的Command类的作用是一致的。采用Command模式解耦了命令的发出者和命令的执行者。

小demo

command.h

#ifndef COMMAND_H#define COMMAND_Hclass Command{public:virtual ~Command() {}virtual void Execute() = 0;};class Receiver{public:void Action();};class Invoker{public:Invoker(Command *pCommand);~Invoker();void Invoke();private:Command *m_pCommand;};class ConcreateComand: public Command{public:ConcreateComand(Receiver* pReceiver);virtual ~ConcreateComand();virtual void Execute();private:Receiver* m_pReceiver;};#endif

command.cpp

#include "Command.h"#include <iostream>void Receiver::Action(){std::cout << "Receiver Action\n";}Invoker::Invoker(Command *pCommand): m_pCommand(pCommand){}Invoker::~Invoker(){delete m_pCommand;m_pCommand = NULL;}void Invoker::Invoke(){if (NULL != m_pCommand){m_pCommand->Execute();}}ConcreateComand::ConcreateComand(Receiver* pReceiver): m_pReceiver(pReceiver){}

 

main.cpp

#include "Command.h"#include <stdlib.h>int main(){Receiver* pReceiver = new Receiver();Command*  pCommand  = new ConcreateComand(pReceiver);Invoker*  pInvoker  = new Invoker(pCommand);pInvoker->Invoke();delete pInvoker;system("pause");return 0;}

Command模式的思想非常简单,但是Command模式也十分常见,并且威力不小。实际上,command模式关键就是提供一个抽象的command类,并将执行操作封装到command类接口中,command类中一般就只是一些接口的集合,并不包含任何的数据属性。好处有:

1.command模式将调用操作的对象和知道如何实现该操作的对象解耦。在command的结构图中,Invoker对象根本就不知道具体的是哪个对象在处理Excute操作(当然要知道是Command类别的对象,也仅此而已)。

2.在command要增加新的处理操作对象很容易,我们可以通过创建新的继承自command的子类来实现这一点。

3.command模式可以喝memento模式结合起来,支持取消的操作。

请求发送者与接收者解耦——命令模式


原创粉丝点击