Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android設計模式系列(7)--SDK源碼之命令模式

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

編輯:Android開發實例

命令模式,在.net,java平台的事件機制用的非常多,幾乎每天都與之打交道。
android中對我印象最深的就是多線程多進程的環境,所以必然大量使用到Runbable,Thread,其實用的就是最簡單的命令模式。
命令模式,Command Pattern,把請求封裝為一個對象,多麼巧妙的一個說法啊。

1.意圖
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或記錄請求日志,以及支持可撤銷的操作。
熱門詞匯:動作 事物 請求封裝 排隊 打包 異步 

2.結構


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


想不到我們天天寫的代碼無意識中就是用到了命令模式,所謂模式,就是無所不在。

3.代碼
命令接口Runnable定義如下:

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

調用者Thread簡化版代碼:

//命令模式這裡不需要繼承Runnable接口,但是這裡考慮到實際情況,比如方便性等,繼承了Runnable接口,實現了run方法,這個是Thread自身的運行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();//這個是本地方法,調用run方法
        if (stopBeforeStart) {
	    stop0(throwableFromStop);
	}
    }

    //可選
    public void run() {
	if (target != null) {
	    target.run();
	}
    }
}

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

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved