閱讀437 返回首頁    go 技術社區[雲棲]


設計模式之命令模式

        在日常生活中,我們常常會遇到這樣一些問題:需要向某些對象發送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們隻需在程序運行時指定具體的請求接收者即可,此時,可以使用命令模式來進行設計,使得請求發送者與請求接收者消除彼此之間的耦合,讓對象之間的調用關係更加靈活。
        命令模式是非常實用的一個模式,比如最常用的就是我們編寫項目中用到的撤銷\恢複(Undo\Redo)就是通過命令模式(Command)來實現的;在如我們的計算器、小孩通過遙控器控製賽車運動,這些都是通過命令模式實現的,下麵就詳細講解命令模式.

一.模式定義

        命令模式(Command Pattern):將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化,對請求排隊或者記錄請求日誌,以及支持可撤銷的操作。命令模式是一種對象行為型模式.
        在命令模式中發送者與接收者沒有直接引用關係,發送請求的對象至需要知道如何發送請求,而不必知道如何完成請求,這就是命令模式的模式動機.

二.模式結構及組成

        命令模式的結構圖如下圖所示:

        其中命令模式的角色如下所示:
        客戶端(Client):創建一個具體的命令對象,並確定其接收者.
        請求者(Invoker):負責發出命令請求.
        接收者(Receiver):具體實施或執行一個請求.
        抽象命令(Command):給出所有具體命令的抽象接口.
        具體命令(ConcreteCommand):實現抽象命令的方法,負責調用接收者.

三.命令模式實例

        先舉一個簡單的例子:
        1.玉帝下旨讓太白金星去招悟空上天庭
        在這個例子中共有五個角色:命令角色:聖旨 ,具體命令角色:具體聖旨,立即上天庭報道,請求者角色:太白金星,接受者角色:美猴王,客戶角色:Client玉帝.
        它的模式圖如下,這就是一個簡單的命令模式的例子.

        下麵這個例子是根據清華大學設計模式PPT中摘抄過來的,是一個比較經典的命令模式的例子,在使用遙控器中我們用到的就是命令模式。
        2.電視機遙控器
        電視機是請求的接收者,遙控器是請求的發送者,遙控器上有一些按鈕,不同的按鈕對應電視機的不同操作。抽象命令角色由一個命令接口來扮演,有三個具體的命令類實現了抽象命令接口,這三個具體命令類分別代表三種操作:打開電視機、關閉電視機和切換頻道。顯然,電視機遙控器就是一個典型的命令模式應用實例。
        其中:
        接受者--Televison
        請求者--Controller
        抽象命令--AbstractCommand
        具體命令--TCOpenCommand、TVChangeCommand、TVCloseCommand
        其中,在項目中的撤銷\恢複(Undo\Redo)也是使用經典的命令模式,這裏就簡單的給出它的類圖,詳細的Undo\Redo可見TerryLee的博客,他進行了詳細的講解並有源代碼注釋:
        https://terrylee.cnblogs.com/archive/2006/07/17/Command_Pattern.html
        3.Undo\Redo
        請求者可以請求命令執行Display、Undo、Redo的操作隊接受者(文章或工程)進行修改。
四.實例代碼詳解模式
        下麵通過股票交易係統的例子和詳細代碼分析命令模式
        (由於忘記該代碼是借鑒了某人的博客,在此處向他表示了對不起,作者隻想借鑒你優秀的代碼供大家學習,而當初沒有記錄下你的網址,在此說聲抱歉.)
        具體的代碼實現如下:
        定義客戶端代碼,聯係請求者、接受者和具體的買賣命令
 
 
        定義股票交易員,請求者
 
         定義抽象命令接口
         定義股票市場,是具體的接受者,執行股票交易操作命令
         定義具體的命令,它繼承抽象命令接口,在具體類中定義了具體要執行的函數.
 
五.優缺點
        最後,總結命令模式的優缺點。
        優點:
              1.降低對象之間的耦合度。
              2.新的命令可以很容易地加入到係統中。
              3.可以比較容易地設計一個組合命令。
              4.調用同一方法實現不同的功能
              5.可以用來做批處理操作
              6.Undo\Redo操作
        缺點:
        因為每一個命令都需要設計一個具體命令類,所以可能會導致係統有過多的具體命令類,影響使用。
        最後,我這篇文章主要講訴的是命令模式,並通過命令模式一些例子來敘述,同時該文章主要思想來自:作者Eastmount自己的思考,《大話設計模式》,《head first設計模式》等書,還有是清華大學的課件,以及一些其他人關於命令模式的博客文章,但由於作者的大意,找不到有些圖來自哪?所以如果作者見到,請見諒,我主要是想分享自己的一些知識供大家學習和了解。如果有錯誤或不足之處,請讀者原諒!!!
      (By:Eastmount 2013-5-12-夜2點)

最後更新:2017-04-03 18:51:52

  上一篇:go 再次說到馬雲,再次說到支付寶
  下一篇:go 我們無需“開始”菜單