1. 定義
將對象組合成樹形結構來表現整體/部分的層次結構,讓用戶以一致的方式處理個別對象以及對象組合。
2. 角色
- Component:對象聲明接口
- Leaf:葉子結點類
- Composite:容器對象類
3. 特點
- 優點:它定義了一個抽象構件類,既可表示葉子對象,又能表示容器對象,使得用戶可以僅針對這個抽象構件類操作而無需知道操作對象是葉子對象還是容器對象,清楚地定義了分層次的複雜對象,使得易於添加新對象。
- 缺點:該模式會使設計變得更加抽象。
4. 示例
構建一個菜單,菜單除了具體菜品,還有另分類的子菜單。
Menu:
public abstract class Menu {
public String name;
public Menu(String name) {
this.name = name;
}
public abstract void add(Menu menu);
public abstract void remove(Menu menu);
public abstract void display(int depth);
}
SubMenu:
public class SubMenu extends Menu {
private List<Menu> menus = new ArrayList<>();
public SubMenu(String name) {
super(name);
}
@Override
public void add(Menu menu) {
menus.add(menu);
}
@Override
public void remove(Menu menu) {
menus.remove(menu);
}
@Override
public void display(int depth) {
System.out.println("第" + depth + "層爲:" + name);
for (Menu menu : menus) {
menu.display(depth + 1);
}
}
}
Meal:
public class Meal extends Menu {
public Meal(String name) {
super(name);
}
@Override
public void add(Menu menu) {
}
@Override
public void remove(Menu menu) {
}
@Override
public void display(int depth) {
System.out.println("第" + depth + "層爲:" + name);
}
}
測試類:
public class TestComposite {
public static void main(String[] args) {
Menu menu = new SubMenu("主菜單");
Menu food1 = new Meal("雞翅");
Menu food2 = new Meal("薯條");
Menu drinks = new SubMenu("飲料菜單");
Menu water = new Meal("白開水");
Menu cola = new Meal("可樂");
drinks.add(cola);
drinks.add(water);
menu.add(food1);
menu.add(food2);
menu.add(drinks);
menu.display(1);
}
}
// 輸出
// 第1層爲:主菜單
// 第2層爲:雞翅
// 第2層爲:薯條
// 第2層爲:飲料菜單
// 第3層爲:可樂
// 第3層爲:白開水
參考:
1. 《Head First 設計模式》