命令模式(Command)模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
使用场景:
1、当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。
2、例如当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时。
3、有时候调用者调用目标对象后,需要回调一些方法。
c++ 实现代码
#include <stdio.h>
class CCommand
{
public:
CCommand();
virtual ~CCommand();
virtual void Execute()=0;
};
class CReceiver
{
public:
void Action(){printf("receiver action() \n");};
protected:
private:
};
class CConcreteCommand:public CCommand
{
public:
CConcreteCommand(CReceiver* pReceiver){m_pReceiver=pReceiver;};
virtual void Execute(){m_pReceiver->Action();};
protected:
private:
CReceiver* m_pReceiver;
};
class CInvoker
{
public:
CInvoker(CCommand* pCommand){m_pCommand=pCommand;};
void Invoke(){m_pCommand->Execute();};
protected:
private:
CCommand* m_pCommand;
};
#include "Command.h"
int main(int argc, char* argv[])
{
CInvoker* pInvoker=new CInvoker(new CConcreteCommand(new CReceiver));
pInvoker->Invoke();
getchar();
return 0;
}
实例
某公司(Client) 告诉生产部(Invoker) 生产一台 惠普电脑 和 一台 戴尔电脑 ,生产部将订单发往工厂(Receiver)去生产。
类图如下:
c++ 代码实现如下:
#define MAX_CMD_COUNT 256
#include <stdio.h>
class CCommand
{
public:
CCommand();
virtual ~CCommand();
virtual void Execute()=0;
};
class ComputerFactory
{
public:
void CreateHP(){printf("create hp \n");};
void CreateDell(){printf("create dell \n");};
protected:
private:
};
class CCreateHpCommand:public CCommand
{
public:
CCreateHpCommand(ComputerFactory* pFactory){m_pFactory=pFactory;};
virtual void Execute(){m_pFactory->CreateHP();};
protected:
private:
ComputerFactory* m_pFactory;
};
class CCreateDellCommand:public CCommand
{
public:
CCreateDellCommand(ComputerFactory* pFactory){m_pFactory=pFactory;};
virtual void Execute(){m_pFactory->CreateDell();};
protected:
private:
ComputerFactory* m_pFactory;
};
class CProductDepartment
{
public:
CProductDepartment()
{
for (int i=0;i<MAX_CMD_COUNT;i++)
{
m_cmd[i]=NULL;
}
}
void Invoke()
{
for (int i=0;i<MAX_CMD_COUNT;i++)
{
if (m_cmd[i])
{
m_cmd[i]->Execute();
delete m_cmd[i];
m_cmd[i]=NULL;
}
}
}
void AddCmd(CCommand* pCmd)
{
for (int i=0;i<MAX_CMD_COUNT;i++)
{
if (!m_cmd[i])
{
m_cmd[i]=pCmd;
break;
}
}
}
protected:
private:
CCommand* m_pCmd;
CCommand* m_cmd[256];
};
#include "Command.h"
int main(int argc, char* argv[])
{
ComputerFactory* pFactory=new ComputerFactory();
CCommand* pHpCommand=new CCreateHpCommand(pFactory);
CCommand* pDellCommand=new CCreateDellCommand(pFactory);
CProductDepartment* pDepartment=new CProductDepartment();
pDepartment->AddCmd(pHpCommand);
pDepartment->AddCmd(pDellCommand);
pDepartment->Invoke();
getchar();
return 0;
}
独立博客地址 : http://www.gddhx.com/post/36.html