設計模式《十四》——命令模式

簡介

       命令模式(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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章