在軟體系統中,“行為請求者”與“行為實作者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵禦變化的緊耦合是不合适的。在這種情況下,如何将“行為請求者”與“行為實作者”解耦?将一組行為抽象為對象,實作二者之間的松耦合。這就是指令模式(command pattern)
工作了一天感覺好累,洗了個澡,打開電視看看有沒有喜歡的節目,拿起遙控器,看着上面的按鈕,忽然感覺好奇妙,我們按一開機鍵,電視就開了,然後...哈哈,真好玩,我按我按。細想之下這不就是一個指令模式麼。
定義指令的接口,聲明執行的方法。
指令接口實作對象,是“虛”的實作;通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。
接收者,真正執行指令的對象。任何類都可能成為一個接收者,隻要它能夠實作指令要求實作的相應功能。
要求指令對象執行請求,通常會持有指令對象,可以持有很多的指令對象。這個是用戶端真正觸發指令并要求指令執行相應操作的地方,也就是說相當于使用指令對象的入口。
client
建立具體的指令對象,并且設定指令對象的接收者。注意這個不是我們正常意義上的用戶端,而是在組裝指令對象和接收者,或許,把這個client稱為裝配者會更好了解,因為真正使用指令的用戶端是從invoker來觸發執行。
①client在c/c++中是主函數或者成員函數,它建立一個concretecommand對象并指定他的receiver對象
②某個invoker對象存儲該concretecommand對象
③該invoker通過調用command對象的execute操作來送出一個請求。若該指令是可撤銷的,concretecommand就在執行execute操作之前存儲目前狀态以用于取消該指令
④concretecommand對象對調用它的receiver的一些操作以執行該請求。
指令接受者才是指令真正的執行者
// 指令的接受者,是真正執行指令的對象
class receiver
{
public :
virtual void action()
{
std::cout <<"do something..." <<endl;
}
};
指令接口的實作對象,執行一個指令,
通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。
// 指令的接口
class command
virtual void execute( ) = 0; // 定義了一個執行的方法
// 指令接口的實作對象,執行一個指令,
// 通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。
class concretecommand : public command
concretecommand(receiver *receiver)
this->receiver = receiver;
void execute()
//通常會轉調接收者對象的相應方法,讓接收者來真正執行功能
receiver->action();
protected:
receiver *receiver; // 内含一個指令接收者
要求指令對象執行請求,
通常會持有指令對象,可以持有很多的指令對象
// 要求指令對象執行請求,
// 通常會持有指令對象,可以持有很多的指令對象
class invoker
void setcommand(command *command)
this->command = command;
void runcommand()
command->execute();
command *command;
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