Android 設計模式 - 組合模式
1. 定義
組合模式,又叫部分整體模式,用於把一組相似的物件當作一個單一的物件。組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。
2. 作用
組合模式使得使用者對單個物件和組合物件的使用具有一致性。它模糊了簡單元素和複雜元素的概念,客戶程式可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。
3. 結構
-
抽象構建角色:
物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告一個介面用於訪問和管理它的子部件。
-
樹葉構建角色:
在組合樹中表示葉節點物件,葉節點沒有子節點。
-
樹枝構建角色:
容器物件,定義有枝節點行為,用來儲存子部件,在介面中實現與子部件有關的操作,例如增加(add)和刪除(remove)等。
4. 實現
Android 裡面的檢視都是 View 的子類,包括 ViewGroup 和 View,我們就模仿它來實現組合模式。

類圖
- 定義抽象構建角色,也就是 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(); }
- 定義樹枝構建角色,在這裡是指 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); } }
- 定義樹葉構建角色,顯示內容的 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); } }
- 測試,把 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. 優點
可以清楚地定義分層次的複雜物件,表示物件的全部或部分層次,增加新構件更容易;客戶端呼叫簡單,可以一致地使用組合結構或其中單個物件。
2. 缺點
使設計變得更加抽象,如果物件的業務規則很複雜,則實現組合模式具有很大挑戰性,而且不是所有的方法都與葉子物件子類都有關聯。
3. 使用場景
需要表示一個物件整體或部分層次,忽略整體與部分的差異,可以一致地對待它們;客戶端可以針對抽象構件程式設計,無須關心物件層次結構的細節。
【附錄】

資料圖