每日Android源碼設(shè)計模式之-10、命令模式

命令模式?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方法來請求命令。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容