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

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