将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消操作。
解析;
将命令封装在一个类中Command类,同时把接收对象也封装在一个类中Receiver类,调用这个命令的类Invoker类,与注册回调函数的原理相似。
#include "stdafx.h"
#include <iostream>
using namespace std;
//Command模式的封装,解除了业务逻辑与实际抽象之间的耦合,且支持事物操作
class Command
{
public:
virtual ~Command(){}
virtual void Execute() = 0;
};
class Receiver
{
public:
void Action() {cout << "fact active\n";}
};
//根据初始化的不同,生成不同用途的命令类
class ConCreateCommand : public Command
{
public:
ConCreateCommand(Receiver* pReceiver):m_pReceiver(pReceiver) {}
virtual ~ConCreateCommand();
virtual void Execute();
private:
Receiver* m_pReceiver;
};
class Invoker
{
public:
Invoker(Command *pCommand):m_pCommand(pCommand) {}
~Invoker();
//可实现do与undo函数,添加一系列命令或是取消某些命令形成一个事物
void invoke();//回调命令函数
private:
Command *m_pCommand;
};
///////////////////////////////////////////////////////////////////////////
Invoker::~Invoker()
{
delete m_pCommand;
m_pCommand = NULL;
}
void ConCreateCommand::Execute()
{
if (NULL != m_pReceiver)
m_pReceiver->Action();
cout << "Execute by ConCreateCommand\n";
}
void Invoker::invoke()
{
if (NULL != m_pCommand)
m_pCommand->Execute();
}
ConCreateCommand::~ConCreateCommand()
{
delete m_pReceiver;
m_pReceiver = NULL;
}
///////////////////////////////////////////////////////////////////////////
int _tmain(int argc, char* argv[])
{
Receiver* pReceiver = new Receiver;
Command* pCommand = new ConCreateCommand(pReceiver);
Invoker* pInvoker = new Invoker(pCommand);
/*
pInvoker->do(pCommand);
pInvoker->do(pCommand1);
pInvoker->undo();
pInvoker->invoke();
*/
pInvoker->invoke();
delete pInvoker;
system("pause");
return 0;
}
posted on 2008-08-20 23:32
黑色天使 阅读(705)
评论(0) 编辑 收藏 引用 所属分类:
设计模式