Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 《Android源碼設計模式解析與實戰》讀書筆記(十九)

《Android源碼設計模式解析與實戰》讀書筆記(十九)

編輯:關於android開發

《Android源碼設計模式解析與實戰》讀書筆記(十九)


第十九章、組合模式

組合模式也稱為部分-整體模式,結構型設計模式之一。

1.定義

將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。

2.使用場景

(1)表示對象的部分-整體層次結構時。

(2)從一個整體中能夠獨立出部分模塊或功能的場景。

3.UML類圖

這裡寫圖片描述

(1)Component:抽象根節點,為組合中的對象聲明接口。在適當的情況下,實現所有類共有接口的缺省行為。聲明一個接口用於訪問和管理Component的子節點。可在遞歸結構中定義一個接口,用於訪問一個父節點,並在合適的情況下實現它。

(2)Composite:定義有子節點的那些枝干節點行為,存儲子節點,在Component接口中實現與子節點有關的操作。

(3)Leaf:在組合中表示葉子節點對象,葉子節點沒有子節點,在組合中定義節點對象的行為。

(4)Client:通過Component接口操縱組合節點的對象。

如圖這種將組合所使用的方法全部定義在抽象類的方式稱為透明的組合模式,如果將Component中的Add、Remove、GetChild去除,只在Composite中單獨添加,這種方式稱為安全的組合模式。然而後者違背了依賴倒置原則。

4.簡單實現

以文件和文件夾這樣的文件系統為例

文件和文件夾的抽象類:(Component)

public abstract class Dir {
    /**
     * 聲明一個List成員變量來儲存文件夾下的所有元素
     */
    protected List
dirs = new ArrayList (); private String name; //當前文件或文件夾名 public Dir(String name) { this.name = name; } /** * 添加一個文件或文件夾 * * @param dir 文件或文件夾 */ public abstract void addDir(Dir dir); /** * 移除一個文件或文件夾 * * @param dir 文件或文件夾 */ public abstract void rmDir(Dir dir); /** * 清空文件夾下所有元素 */ public abstract void clear(); /** * 輸出文件夾目錄結構 */ public abstract void print(); /** * 獲取文件夾下所有的文件或文件夾 * * @return 文件夾下所有的文件或文件夾 */ public abstract List getFiles(); /** * 獲取文件或文件夾名 * * @return 文件或文件夾名 */ public String getName(){ return name; } }

表示文件夾的類:(Composite)

public class Folder extends Dir{

    public Folder(String name) {
        super(name);
    }

    @Override
    public void addDir(Dir dir) {
        dirs.add(dir);
    }

    @Override
    public void rmDir(Dir dir) {
        dirs.remove(dir);
    }

    @Override
    public void clear() {
        dirs.clear();
    }

    @Override
    public void print() {
        System.out.print(getName() + "(");
        Iterator
iter = dirs.iterator(); while (iter.hasNext()) { Dir dir = iter.next(); dir.print(); if(iter.hasNext()){ System.out.print(", "); } } System.out.print(")"); } @Override public List getFiles() { return dirs; } }

表示文件夾的類:(Leaf)

public class File extends Dir{

    public File(String name) {
        super(name);
    }

    @Override
    public void addDir(Dir dir) {
        throw new UnsupportedOperationException("文件對象不支持該操作!");
    }

    @Override
    public void rmDir(Dir dir) {
        throw new UnsupportedOperationException("文件對象不支持該操作!");
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException("文件對象不支持該操作!");
    }

    @Override
    public void print() {
        System.out.print(getName());
    }

    @Override
    public List
getFiles() { throw new UnsupportedOperationException("文件對象不支持該操作!"); } }

客戶類:

public class Client {
    public static void main(String[] args) {
        //構造一個目錄對象表示C盤根目錄
        Dir diskC = new Folder("C");

        //C盤根目錄下有一個文件Log.txt
        diskC.addDir(new File("Log.txt"));

        //C盤根目錄下有三個目錄Windows、PerfLogs、Program File
        Dir dirWin = new Folder("Windows");

        //Windows目錄下有文件explorer.exe
        dirWin.addDir(new File("explorer.exe"));
        diskC.addDir(dirWin);

        //PerfLogs目錄
        Dir dirPer = new Folder("PerfLogs");

        //PerfLogs目錄下有文件null.txt
        dirPer.addDir(new File("null.txt"));
        diskC.addDir(dirPer);

        //Program File目錄
        Dir dirPro = new Folder("Program File");

        //Program File目錄下有文件ftp.txt
        dirPro.addDir(new File("ftp.txt"));
        diskC.addDir(dirPro);

        //打印出文件結構
        diskC.print();
    }
}

結果:

C(Log.txt, Windows(explorer.exe), PerfLogs(null.txt), Program File(ftp.txt))

5.Android源碼中的模式實現

1.View和ViewGroup的嵌套組合

View和ViewGroup的結構很像上面的UML類圖,不過View的視圖層級使用的是安全的組合模式。ViewGroup有對View的addView、removeView、getChildAt等方法,想必大家也很熟悉。

6.總結

1.優點

(1)組合模式可以清楚地定義分層次的復雜對象,表示對象的全部或部分層次,他讓高層模塊忽略了層次的差異,方便對整個層次結構進行控制。

(2)簡化了高層模塊的代碼。

(3)在組合模式中增加新的枝干構件和葉子構件都很方便,無須對現有類庫進行修改,符合“開閉原則”。

(4)對樹形結構的控制變得簡單。

2.缺點

組合模式不容易限制組合中的構件。因為大多數情況下,它們都來自於相同的抽象層,此時,必須進行類型檢查來實現,這個實現過程較為復雜。

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