簡介
命令模式(Command)是一種數據驅動的模式,Command的類封裝了對目標對象的調用行爲以及調用參數。其目的是將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進行參數化。
在面向對象的程序設計中,一個對象調用另一個對象,一般情況下的調用過程是:創建目標對象實例;設置調用參數;調用目標對象的方法。但在有些情況下有必要使用一個專門的類對這種調用過程加以封裝,我們把這種專門的類稱作command類。
角色與職責
Invoker:調用者;
Command:命令接口;
Receiver:被調用者;
實現
#include <iostream>
using namespace std;
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
class Receiver{
public:
void Action(){
cout << "Receiver->Action" << endl;
}
void Cancel() {
cout << "Cancel Action" << endl;
}
};
class Command{
public:
virtual void Execute() = 0;
virtual void Cancel() = 0;
};
class ConcreteCommand : public Command{
public:
ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver) {}
void Execute(){
cout << "ConcreteCommand Send Command:" << endl;
m_pReceiver->Action();
}
void Cancel() {
cout << "ConcreteCommand Cancel Command:" << endl;
m_pReceiver->Cancel();
}
private:
Receiver *m_pReceiver;
};
class Invoker{
public:
Invoker(Command *pCommand) : m_pCommand(pCommand) {}
void Invoke(){
m_pCommand->Execute();
}
void CancelCommand() {
m_pCommand->Cancel();
}
private:
Command *m_pCommand;
};
int main(){
Receiver *pReceiver = new Receiver();
Command *pCommand = new ConcreteCommand(pReceiver);
Invoker *pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
pInvoker->CancelCommand();
SAFE_DELETE(pInvoker);
SAFE_DELETE(pCommand);
SAFE_DELETE(pReceiver);
cin.get();
return 0;
}