意圖:講一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或者記錄請求日誌,以及支援可撤銷的操作.
通過將請求本身變成一個對象來使工具箱對象可向未指定的應用對象提出請求
適用性:
抽象出待執行的動作以參數化某對象,可以通過回呼函數表達這種參數化
支援取消操作(UnExecute)
樣本圖:
範例程式碼:
#pragma once
#include "Move.h"
//command基類提供Execute介面
class CBaseCommand
{
public:
CBaseCommand(void);
public:
~CBaseCommand(void);
virtual void
Execute()=0;
virtual void UnExecute()
{
}
};
//移動命令
class CMoveCommand:public CBaseCommand
{
public:
CMoveCommand()
:CBaseCommand()
{
}
~CMoveCommand()
{
}
public:
virtual void
Execute()
{
//使用移動操作進行移動
CMove move;
move.MoveTo(_T("Left 10 px"));
}
virtual void Redo()
{
Execute();
}
virtual void Undo()
{
UnExecute();
}
virtual void UnExecute()
{
CMove
move;
move.MoveTo(_T("Right 10 px"));
}
};
//使用模板來進行簡單命令的執行操作
//不能支援特殊的操作比如Undo/Redo等
template <class
CReceiver>
class CSimpleCommand:public CBaseCommand
{
public:
typedef void (CReceiver::* Action)();
CSimpleCommand(CReceiver*
pRec,Action action)
:CBaseCommand(),m_pRec(pRec),m_action(action)
{
}
//執行操作
virtual void
Execute()
{
(m_pRec->*m_action)();
}
private:
CReceiver* m_pRec;
Action
m_action;
};