命令模式沒有很多的條條框框,更為靈活多變,比如程序菜單命令,點擊“關機”按鈕以后,系統會執行一系列操作,暫停處理事件、保存配置、結束進程等等。
定義:
將一個請求封裝成一個對象,從而讓用戶使用不同的請求把客戶端參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。
使用場景:
需要抽象出待執行的動作,然后以參數的形式提供出來,類似于過程設計中的回調機制。
在不同時刻、排列和執行請求。一個命令對象可以有與初始請求無關的生存期。
需要支持取消操作。
支持修改日志功能,這樣當系統崩潰時,這些修改可以被重做一遍。
需要支持實務操作。
類圖:
很簡單,也就是Invoker請求者類,持有Command類的引用,Command類又持有Receiver類的引用。
當Client調用使用Invoker類去調用方法的時候,先調用Command類的execute方法然后再去調用Receiver類的actioin方法。
也就是由以往的直接調用變為中間多了一層Command類,使得調用與被調用者之間解耦開來。
Android中對命令模式的使用都不是典型,有一些變種
比如:Android的事件機制中低層邏輯對事件的轉發處理,每種事件在屏幕上產生后都會由低層邏輯將其轉化為一個NotifyArgs對象,它本身沒有任何實現,只是定義了抽象的方法體:
struct NotifyArgs(){
? ?virtual ~NotifyArgs(){}
? ?virtual void notify(const sp<InputListenerInterface>&listener) const = 0;
}
按鍵事件最終被轉化為NotifyKeyArgs對象,他繼承了NotifyKeyArgs。相當于一個命令者。
而InputDispatcher承擔了命令請求者的角色。里面執行notifyKey方法來請求命令。