每日Android源碼設計模式之-10、命令模式

命令模式沒有很多的條條框框,更為靈活多變,比如程序菜單命令,點擊“關機”按鈕以后,系統會執行一系列操作,暫停處理事件、保存配置、結束進程等等。


定義:

將一個請求封裝成一個對象,從而讓用戶使用不同的請求把客戶端參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。

使用場景:

需要抽象出待執行的動作,然后以參數的形式提供出來,類似于過程設計中的回調機制。

在不同時刻、排列和執行請求。一個命令對象可以有與初始請求無關的生存期。

需要支持取消操作。

支持修改日志功能,這樣當系統崩潰時,這些修改可以被重做一遍。

需要支持實務操作。

類圖:


很簡單,也就是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方法來請求命令。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容