Android 設計模式 - 組合模式

1. 定義

組合模式,又叫部分總體模式,用於把一組類似的對象看成一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及總體層次。編程

2. 做用

組合模式使得用戶對單個對象和組合對象的使用具備一致性。它模糊了簡單元素和複雜元素的概念,客戶程序能夠像處理簡單元素同樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。bash

3. 結構

  • 抽象構建角色:ide

    對象聲明接口,在適當的狀況下,實現全部類共有接口的默認行爲。聲明一個接口用於訪問和管理它的子部件。測試

  • 樹葉構建角色:this

    在組合樹中表示葉節點對象,葉節點沒有子節點。spa

  • 樹枝構建角色:設計

    容器對象,定義有枝節點行爲,用來存儲子部件,在接口中實現與子部件有關的操做,例如增長(add)和刪除(remove)等。code

4. 實現

Android 裏面的視圖都是 View 的子類,包括 ViewGroup 和 View,咱們就模仿它來實現組合模式。orm

類圖

  1. 定義抽象構建角色,也就是 View 接口,它有寬和高兩個屬性。
public abstract class View {
    protected int width;
    protected int height;

    public View(int width, int height){
        this.width = width;
        this.height = height;
    }

    public abstract void display();
}

複製代碼
  1. 定義樹枝構建角色,在這裏是指 View 容器,負責添加、移除和展現子 View。
public class ViewGroup extends View {
    private List<View> viewList;

    public ViewGroup(int width, int height) {
        super(width, height);
        viewList = new ArrayList<>();
    }

    @Override
    public void display() {
        System.out.println("我是容器,寬:" + width + ",高:" + height + ",裏面有" + viewList.size() + "個子視圖");
        for (View view : viewList) {
            view.display();
        }
    }

    public void addView(View view) {
        viewList.add(view);
    }

    public void removeView(View view) {
        viewList.remove(view);
    }
}

複製代碼
  1. 定義樹葉構建角色,顯示內容的 View,好比按鈕、文本框等。
public class Button extends View {

    public Button(int width, int height) {
        super(width, height);
    }

    @Override
    public void display() {
        System.out.println("我是按鈕,寬:" + width + ",高:" + height);
    }
}

public class TextView extends View {

    public TextView(int width, int height) {
        super(width, height);
    }

    @Override
    public void display() {
        System.out.println("我是文本框,寬:" + width + ",高:" + height);
    }
}

複製代碼
  1. 測試,把 View 添加到容器中並展現。
public static void main(String args[]) {
        Button button = new Button(100, 200);
        TextView textView = new TextView(200, 200);
        ViewGroup viewGroup = new ViewGroup(300, 300);
        viewGroup.addView(button);
        viewGroup.addView(textView);
        viewGroup.display();
    }

複製代碼

5. 優缺點

1. 優勢 能夠清楚地定義分層次的複雜對象,表示對象的所有或部分層次,增長新構件更容易;客戶端調用簡單,能夠一致地使用組合結構或其中單個對象。cdn

2. 缺點 使設計變得更加抽象,若是對象的業務規則很複雜,則實現組合模式具備很大挑戰性,並且不是全部的方法都與葉子對象子類都有關聯。

3. 使用場景 須要表示一個對象總體或部分層次,忽略總體與部分的差別,能夠一致地對待它們;客戶端能夠針對抽象構件編程,無須關心對象層次結構的細節。

相關文章
相關標籤/搜索