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 设计模式》