天天看點

C++設計模式10--指令模式(一)--降低請求發送者與接收者耦合 指令模式概述 指令模式結構 基本代碼

在軟體系統中,“行為請求者”與“行為實作者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵禦變化的緊耦合是不合适的。在這種情況下,如何将“行為請求者”與“行為實作者”解耦?将一組行為抽象為對象,實作二者之間的松耦合。這就是指令模式(command pattern) 

  工作了一天感覺好累,洗了個澡,打開電視看看有沒有喜歡的節目,拿起遙控器,看着上面的按鈕,忽然感覺好奇妙,我們按一開機鍵,電視就開了,然後...哈哈,真好玩,我按我按。細想之下這不就是一個指令模式麼。

定義指令的接口,聲明執行的方法。

指令接口實作對象,是“虛”的實作;通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。

接收者,真正執行指令的對象。任何類都可能成為一個接收者,隻要它能夠實作指令要求實作的相應功能。

要求指令對象執行請求,通常會持有指令對象,可以持有很多的指令對象。這個是用戶端真正觸發指令并要求指令執行相應操作的地方,也就是說相當于使用指令對象的入口。

client

建立具體的指令對象,并且設定指令對象的接收者。注意這個不是我們正常意義上的用戶端,而是在組裝指令對象和接收者,或許,把這個client稱為裝配者會更好了解,因為真正使用指令的用戶端是從invoker來觸發執行。

①client在c/c++中是主函數或者成員函數,它建立一個concretecommand對象并指定他的receiver對象

②某個invoker對象存儲該concretecommand對象

③該invoker通過調用command對象的execute操作來送出一個請求。若該指令是可撤銷的,concretecommand就在執行execute操作之前存儲目前狀态以用于取消該指令

④concretecommand對象對調用它的receiver的一些操作以執行該請求。

指令接受者才是指令真正的執行者

C++設計模式10--指令模式(一)--降低請求發送者與接收者耦合 指令模式概述 指令模式結構 基本代碼

// 指令的接受者,是真正執行指令的對象  

class receiver  

{  

public :  

    virtual void action()  

    {  

        std::cout <<"do something..." <<endl;  

    }  

};  

指令接口的實作對象,執行一個指令,

通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。

C++設計模式10--指令模式(一)--降低請求發送者與接收者耦合 指令模式概述 指令模式結構 基本代碼

// 指令的接口  

class command  

    virtual void execute( ) = 0;        // 定義了一個執行的方法  

// 指令接口的實作對象,執行一個指令,  

// 通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。  

class concretecommand : public  command  

    concretecommand(receiver *receiver)  

       this->receiver = receiver;  

    void execute()  

       //通常會轉調接收者對象的相應方法,讓接收者來真正執行功能  

       receiver->action();  

protected:  

    receiver *receiver; // 内含一個指令接收者  

要求指令對象執行請求,

 通常會持有指令對象,可以持有很多的指令對象

C++設計模式10--指令模式(一)--降低請求發送者與接收者耦合 指令模式概述 指令模式結構 基本代碼

// 要求指令對象執行請求,  

// 通常會持有指令對象,可以持有很多的指令對象  

class invoker  

    void setcommand(command *command)  

       this->command = command;  

    void runcommand()  

        command->execute();  

    command *command;  

C++設計模式10--指令模式(一)--降低請求發送者與接收者耦合 指令模式概述 指令模式結構 基本代碼

int main( )  

    //建立接收者  

    receiver *receiver = new receiver;  

    //建立指令對象,設定它的接收者  

    command *command = new concretecommand(receiver);  

    //建立invoker,把指令對象設定進去  

    invoker *invoker = new invoker;  

    invoker->setcommand(command);        // invoker發出command指令  

    invoker->runcommand( );              // 然後去執行這個指令  

}  

好了我們在這裡隻是簡單講講,指令模式的基礎概念,以及基本代碼實作。下一篇我們将用具體例子實作一下,友善大家了解

轉載:http://blog.csdn.net/gatieme/article/details/18043301

繼續閱讀