您的位置:首页 > 编程语言 > C语言/C++

设计模式之命令模式 及 c++ 实现

2012-12-09 00:17 369 查看
命令模式(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息