將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消操作。

解析;
將命令封裝在一個類中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
黑色天使 閱讀(726)
評論(0) 編輯 收藏 引用 所屬分類:
設計模式