1. 程式人生 > >HeadFirst 設計模式筆記(六)—— 命令模式

HeadFirst 設計模式筆記(六)—— 命令模式

命令模式所實現的就像餐館裡的“訂單”物件:服務員不需要知道具體的訂單內容,他只需要把訂單物件傳送給廚師就好了!如此一來,服務員與廚師就解耦了。 書中舉了個遙控器的例子。遙控器需要控制多種電器的開關操作,比如有電燈和電視機。如果把開啟電燈的操作直接實現在按鈕函式中,那麼電燈與遙控就成了緊耦合,如果電燈更新了,那麼遙控器的程式碼也必須改變。 現在我們考慮把二者解耦,遙控器不需要知道具體開燈的步驟,我們會傳給它一個實現了Command介面的類,而它只需呼叫execute方法即可,不需關心電燈到底是如何開啟的,因為這些東西已經被封裝在execute方法中。 public interface Command { public void execute(); } public clqss LightOnCommand implements Command {//實現execute方法...} 總之命令模式將“請求”封裝成物件,以便使用不同的請求來引數化其他物件。我們封裝“命令物件”的做法也可以支援撤銷操作:只要把每次執行的命令記錄下來就可以在需要時撤銷到之前的狀態。(當然Command接口裡需要加入一個undo方法,不同的“命令”物件需要實現相應的撤銷操作) 命令模式的更多用途:
  • 佇列請求。想象有一個工作佇列,一端用來新增命令,另一端命令不斷被取出、執行。
  • 日誌請求。某些應用需要我們將所有動作(“命令”)記錄在日誌中,一旦系統宕機,只要重新執行這些命令即可恢復系統狀態。這很像windows裡系統還原點涉及到的功能。