話說,《西遊記》中有這樣一段故事,玉帝指令太白金星召美猴王上天:"金星徑入水簾洞當中,面南立定道:我是西方太白金星,奉玉帝招安聖旨,請你上界報道,拜受仙錄。具體對話内容如下所示:
太白金星:大聖,我主玉帝聽說你才能出衆,對你非常期待啊。
孫大聖:是麼,真的?
太白金星:上界衆仙也很仰慕大聖你啊。
孫大聖:這......
太白金星:大聖還猶豫是麼?
孫大聖:我去做什麼?
太白金星:絕對一把手,你的地盤好像很大,具體上去就知道了。
孫大聖:那我去看看也好。
太白金星:哈哈,大聖,請!
今天我們的設計模式就從孫大聖上界報道開始說起---指令模式,即将一個請求封裝為一個對象,進而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支援可撤消的操作。在軟體系統中,“行為請求者”與“行為實作者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵禦變化的緊耦合是不合适的。在這種情況下,如何将“行為請求者”與“行為實作者”解耦?将一組行為抽象為對象,實作二者之間的松耦合。
指令模式屬于行為模式。意圖是将一個請求封裝為一個對象,進而使你可用不同的請求對客戶進行參數化;對請求的排隊或記錄請求的日志,以及支援可以撤銷的操作。又叫動作(Action)或者事務(Transaction)。有時必須向一個對象送出請求,但是并不知道關于被請求的操作或者請求的接受者的任何資訊。指令模式通過将請求本身變成一個對象來使工具箱對象可向未指定的應用對象提出請求,這個對象可以被存儲并像其他的對象一樣被傳遞,這一個模式的關鍵是抽象的Command類,它定義了一個執行操作的接口,其最簡單的形式是一個抽象的Execute操作,具體的Command子類将接收者作為其一個執行個體變量,并實作Execute操作,制定接收者采取的動作,而接收者有執行該請求所需的具體資訊。這就是指令模式(Command
Pattern)首先來看一下指令模式的結構圖:

來分析一下,孫悟空上界報道中的邏輯關系,'"玉帝是系統的用戶端,太白金星是指令的發出者,猴王是指令的接收者,聖旨就是指令。玉帝的這一道指令就是要求猴王到上界報到。玉帝隻管發出指令,而不管指令是怎樣傳達到美猴王的。太白金星負責将聖旨傳到,可是美猴王怎麼執行聖旨、何時執行聖旨是美猴王自己的事。來看一下代碼實作:
對于指令模式,我們可以這樣了解,提供一個抽象的Command接口,将執行指令操作的方法封裝到Command類接口中,ConcreteCommand實作這個Command接口方法,通過調用Receiver執行個體變量處理請求。用戶端定義一個Invoker對象存儲該concreteCommand對象,該invoker通過調用command對象的遞交一個請求。