命令模式?jīng)]有很多的條條框框,更為靈活多變,比如程序菜單命令,點擊“關(guān)機”按鈕以后,系統(tǒng)會執(zhí)行一系列操作,暫停處理事件、保存配置、結(jié)束進程等等。
定義:
將一個請求封裝成一個對象,從而讓用戶使用不同的請求把客戶端參數(shù)化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。
使用場景:
需要抽象出待執(zhí)行的動作,然后以參數(shù)的形式提供出來,類似于過程設(shè)計中的回調(diào)機制。
在不同時刻、排列和執(zhí)行請求。一個命令對象可以有與初始請求無關(guān)的生存期。
需要支持取消操作。
支持修改日志功能,這樣當(dāng)系統(tǒng)崩潰時,這些修改可以被重做一遍。
需要支持實務(wù)操作。
類圖:

很簡單,也就是Invoker請求者類,持有Command類的引用,Command類又持有Receiver類的引用。
當(dāng)Client調(diào)用使用Invoker類去調(diào)用方法的時候,先調(diào)用Command類的execute方法然后再去調(diào)用Receiver類的actioin方法。
也就是由以往的直接調(diào)用變?yōu)橹虚g多了一層Command類,使得調(diào)用與被調(diào)用者之間解耦開來。
Android中對命令模式的使用都不是典型,有一些變種
比如:Android的事件機制中低層邏輯對事件的轉(zhuǎn)發(fā)處理,每種事件在屏幕上產(chǎn)生后都會由低層邏輯將其轉(zhuǎn)化為一個NotifyArgs對象,它本身沒有任何實現(xiàn),只是定義了抽象的方法體:
struct NotifyArgs(){
? ?virtual ~NotifyArgs(){}
? ?virtual void notify(const sp<InputListenerInterface>&listener) const = 0;
}
按鍵事件最終被轉(zhuǎn)化為NotifyKeyArgs對象,他繼承了NotifyKeyArgs。相當(dāng)于一個命令者。
而InputDispatcher承擔(dān)了命令請求者的角色。里面執(zhí)行notifyKey方法來請求命令。