重學設計模式 - Command(命令)模式 - 行爲型

1、意圖

  • 將一個請求封裝爲一個對象,從而可用不同的請求對客戶進行參數化;對請求排隊或記錄日誌;以及支持可撤銷的操作。

2、動機

  • 有時必須向某對象提交請求,但並不知道關於被請求的操作(或請求的接受者)的任何信息。
  • 提交一個請求的對象僅需要知道如何提交它,而不需知道該請求將會被如何執行。

3、適用性

  • COMMAND模式是回調機制的一個面向對象的替代品。
  • 在不同的時刻指定、排列和執行請求。如果一個請求的接收者可用一種與地址空間無關的方式表達,那麼就可將負責該請求的命令對象傳送給另一個不同的進程並在那兒實現該請求。
  • 支持取消操作。COMMAND的Execute操作在執行實際操作前可將狀態存儲起來,取消操作時這個狀態用來消除影響。
  • 支持修改日誌。用於崩潰恢復。
  • 用構建在原語操作上的高層操作構造一個系統。常用於支持事務(transaction)的信息系統。

4、結構

5、參與者

  • Command
    - 定義執行的操作的接口。
  • ConcreteCommand
    - 將一個接收者對象綁定於一個命令;
    - 調用接收者相應的操作,以實現Execute。
  • Client
    - 創建一個具體對象並指定其接收者。
  • Invoker
    - 要求該命令執行這個請求
  • Receiver
    - 知道如何實施與執行一個請求相關的操作。任何類都可能作爲一個接收者。

6、協作

  • Client創建一個ConcreteCommand對象並指定它的receiver對象。
  • 某Invoker對象存儲該ConcreteCommand對象。
  • 該Invoker對象通過調用Command對象的Execute操作來提交一個請求。若該命令是可撤銷的,ConcreteCommand就在執行Execute操作之前存儲當前狀態以用於取消該命令。
  • ConcreteCommand對象調用它的Receiver對象以實現該請求。

 

7、效果

  • 將調用操作的對象與知道如何實現該操作的對象解耦;
  • Command是頭等的對象,它們可像其他對象那樣被操縱和擴展;
  • 可將多個命令組合成一個複合命令。
  • 增加新的Command很容易,無需改變已有的類。

8、實現

  • 命令對象的能力  可大可小,一個極端是它僅確定一個接收者和執行該請求的動作,另一個極端是它自己實現所有功能,根本不需要額外的接收者對象。
  • 支持撤銷(Undo)和重做(Redo) ConcreteCommand可能需要存儲額外的狀態信息,包括:
    1)接收者對象,它真正執行處理 該請求的各操作;
    2)接收者執行操作的參數;
    3)如果處理請求的操作會改變接收者對象中的某些值,那麼這些值也必須先存儲起來。接收者還必須提供一些操作,以使該命令可將接收者恢復到它先前的狀態。
    歷史調用列表中,如果命令的狀態在各次調用之間會發生變化,那麼就必須在放入歷史列表前先拷貝下來以區分相同命令的不同調用。
  • 避免取消操作過程中的錯誤積累  在實現一個可靠的、能保持原先語義的取消/重做機制時,可能會遇到滯後影響問題。由於命令的重複執行可能會積累錯誤,以至一個應用的狀態最終偏離初始值。這就有必要在Command中存入更多的信息以保證對象可被精確的復原成它們的初始狀態。可使用Memento模式來讓該Command訪問這些信息而不暴露對象的其他內部信息。
  • 使用C++模板  對(1)不能撤銷 (2)不需要參數的命令,可使用C++模板實現,不需要爲每一種動作和接收者都創建一個Command子類。

9、相關模式

  • Composite模式可被用來實現複合命令;
  • Memento模式可用來保持某個狀態,Command用這個狀態來取消它執行的效果;
  • 在放入歷史列表中之前必須被拷貝的那些Command起到原型(Prototype模式)的作用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章