437
技術社區[雲棲]
設計模式之命令模式
在日常生活中,我們常常會遇到這樣一些問題:需要向某些對象發送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們隻需在程序運行時指定具體的請求接收者即可,此時,可以使用命令模式來進行設計,使得請求發送者與請求接收者消除彼此之間的耦合,讓對象之間的調用關係更加靈活。
命令模式是非常實用的一個模式,比如最常用的就是我們編寫項目中用到的撤銷\恢複(Undo\Redo)就是通過命令模式(Command)來實現的;在如我們的計算器、小孩通過遙控器控製賽車運動,這些都是通過命令模式實現的,下麵就詳細講解命令模式.
一.模式定義
命令模式(Command Pattern):將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化,對請求排隊或者記錄請求日誌,以及支持可撤銷的操作。命令模式是一種對象行為型模式.
在命令模式中發送者與接收者沒有直接引用關係,發送請求的對象至需要知道如何發送請求,而不必知道如何完成請求,這就是命令模式的模式動機.
二.模式結構及組成
命令模式的結構圖如下圖所示:
其中命令模式的角色如下所示:
客戶端(Client):創建一個具體的命令對象,並確定其接收者.
請求者(Invoker):負責發出命令請求.
接收者(Receiver):具體實施或執行一個請求.
抽象命令(Command):給出所有具體命令的抽象接口.
具體命令(ConcreteCommand):實現抽象命令的方法,負責調用接收者.
先舉一個簡單的例子:
1.玉帝下旨讓太白金星去招悟空上天庭
在這個例子中共有五個角色:命令角色:聖旨 ,具體命令角色:具體聖旨,立即上天庭報道,請求者角色:太白金星,接受者角色:美猴王,客戶角色:Client玉帝.
它的模式圖如下,這就是一個簡單的命令模式的例子.

2.電視機遙控器
電視機是請求的接收者,遙控器是請求的發送者,遙控器上有一些按鈕,不同的按鈕對應電視機的不同操作。抽象命令角色由一個命令接口來扮演,有三個具體的命令類實現了抽象命令接口,這三個具體命令類分別代表三種操作:打開電視機、關閉電視機和切換頻道。顯然,電視機遙控器就是一個典型的命令模式應用實例。
接受者--Televison









1.降低對象之間的耦合度。
2.新的命令可以很容易地加入到係統中。
3.可以比較容易地設計一個組合命令。
4.調用同一方法實現不同的功能
5.可以用來做批處理操作
6.Undo\Redo操作
因為每一個命令都需要設計一個具體命令類,所以可能會導致係統有過多的具體命令類,影響使用。
最後,我這篇文章主要講訴的是命令模式,並通過命令模式一些例子來敘述,同時該文章主要思想來自:作者Eastmount自己的思考,《大話設計模式》,《head first設計模式》等書,還有是清華大學的課件,以及一些其他人關於命令模式的博客文章,但由於作者的大意,找不到有些圖來自哪?所以如果作者見到,請見諒,我主要是想分享自己的一些知識供大家學習和了解。如果有錯誤或不足之處,請讀者原諒!!!
(By:Eastmount 2013-5-12-夜2點)
最後更新:2017-04-03 18:51:52