Android設(shè)計(jì)模式系列(7)--SDK源碼之命令模式

1.意圖
將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷的操作。

2.結(jié)構(gòu)


Command接口提供了Execute方法,客戶端通過Invoker調(diào)用命令操作來調(diào)用Recriver,繞了一大圈,但是卻把具體對(duì)Receiver的操作請(qǐng)求封裝在具體的命令中,是客戶端對(duì)recriver的操作清晰簡明。
但是在實(shí)際項(xiàng)目中,我們常常忽略Receiver,而把命令對(duì)象的目標(biāo)對(duì)象直接設(shè)置為子類自己的成員變量或者作為execute()方法的臨時(shí)變量。
以Android中的Runnable(在java.lang包下)為例,我們畫出UML結(jié)構(gòu)圖如下:


想不到我們天天寫的代碼無意識(shí)中就是用到了命令模式,所謂模式,就是無所不在。
3.代碼
命令接口Runnable定義如下:

public interface Runnable {
    public abstract void run();
}

調(diào)用者Thread簡化版代碼:

//命令模式這里不需要繼承Runnable接口,但是這里考慮到實(shí)際情況,比如方便性等,繼承了Runnable接口,實(shí)現(xiàn)了run方法,這個(gè)是Thread自身的運(yùn)行run的方法
class Thread implements Runnable {
    private Runnable target;
     
    public Thread(Runnable target) {
        this.target = target;
    }
 
     public synchronized void start() {
 
        if (threadStatus != 0 || this != me)
            throw new IllegalThreadStateException();
        group.add(this);
        start0();//這個(gè)是本地方法,調(diào)用run方法
        if (stopBeforeStart) {
        stop0(throwableFromStop);
    }
    }
 
    //可選
    public void run() {
    if (target != null) {
        target.run();
    }
    }
}

客戶端只需要new Thread(new Runnable(){}).start()就開始執(zhí)行相關(guān)的一系列的請(qǐng)求,這些請(qǐng)求大部分都是實(shí)現(xiàn)Runnable接口的匿名類。

4.效果
(1).行為型模式;
(2).將調(diào)用對(duì)象的操作和知道如何實(shí)現(xiàn)該操作的對(duì)象解耦;
(3).多個(gè)命令可以裝配成一個(gè)復(fù)合命令;
(4).增加新的命令很容易。

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 1 場景問題# 1.1 如何開機(jī)## 估計(jì)有些朋友看到這個(gè)標(biāo)題會(huì)非常奇怪,電腦裝配好了,如何開機(jī)?不就是按下啟動(dòng)按...
    七寸知架構(gòu)閱讀 2,889評(píng)論 1 59
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評(píng)論 18 399
  • 目錄 本文的結(jié)構(gòu)如下: 什么是命令模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 總...
    w1992wishes閱讀 1,239評(píng)論 2 9
  • 不想以冷酷的形式說再見 一場告別 如果有了計(jì)算 就失去了唯美的記憶 分別有時(shí)是激憤慘烈的 它用力推開一切 想要逃脫...
    天籟村閱讀 209評(píng)論 0 0

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