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

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

編輯:關於Android編程

第十九章、組合模式

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

1.定義

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

2.使用場景

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

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

3.UML類圖

這裡寫圖片描述

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

(2)CompZ喎?/kf/ware/vc/" target="_blank" class="keylink">vc2l0ZTwvY29kZT6jurao0uXT0NfTvdq147XExMfQqdamuMm92rXj0NDOqqOstOa0otfTvdq146Os1NpDb21wb25lbnS907/a1tDKtc/W0+vX073atePT0LnYtcSy2df3oaM8L3A+DQo8cD6jqDOjqTxjb2RlPkxlYWY8L2NvZGU+o7rU2tfpus/W0LHtyr7SttfTvdq147bUz/OjrNK219O92rXjw7vT0NfTvdq146Os1NrX6brP1tC2qNLlvdq147bUz/O1xNDQzqqhozwvcD4NCjxwPqOoNKOpPGNvZGU+Q2xpZW50PC9jb2RlPqO6zai5/UNvbXBvbmVudL3Tv9qy2dfd1+m6z73ateO1xLbUz/OhozwvcD4NCjxibG9ja3F1b3RlPg0KCTxwPsjnzbzV4tbWvavX6brPy/nKudPDtcS3vbeoyKuyv7ao0uXU2rPpz/PA4LXEt73KvbPGzqo8c3Ryb25nPs24w/e1xNfpus/Eo8q9PC9zdHJvbmc+o6zI57n7vatDb21wb25lbnTW0LXEQWRkoaJSZW1vdmWhokdldENoaWxkyKWz/aOs1rvU2kNvbXBvc2l0ZdbQtaW2wMztvNOjrNXi1ta3vcq9s8bOqjxzdHJvbmc+sLLIq7XE1+m6z8Sjyr08L3N0cm9uZz6ho8i7tvi689XfzqWxs8HL0sDAtbW51sPUrdTyoaM8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8aDIgaWQ9"4簡單實現">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