跳转到内容

组合 (Composite)

组合 (Composite) 是一种结构型设计模式,将对象组合成树状层次结构,使用户对单个对象组合对象具有一致的访问性(统一当作“组件”处理)。

  • 存在“部分-整体”的层次结构(如目录与文件、菜单与菜单项),希望用统一方式处理叶子与容器。
  • 若对叶子和容器分别处理,客户端需要大量分支判断,难以扩展。
  • 定义组件 (Component) 抽象:声明叶子和容器共有的接口(如 operation()add()/remove() 等,叶子可空实现或抛异常)。
  • 叶子 (Leaf):无子节点,实现组件的业务行为。
  • 组合 (Composite):有子组件列表,实现组件的业务行为时通常遍历子组件并委托;同时提供增删子组件的方法。
  • 客户端只依赖 Component,可统一处理树中任意节点。
classDiagram
    class Component {
        <<abstract>>
        +operation()* void
        +add(Component c) void
        +remove(Component c) void
    }
    class Leaf {
        +operation() void
    }
    class Composite {
        -children List~Component~
        +operation() void
        +add(Component c) void
        +remove(Component c) void
    }
    Component <|-- Leaf
    Component <|-- Composite
    Composite o-- Component : children
public abstract class Component {
public abstract void operation();
public void add(Component c) {
throw new UnsupportedOperationException();
}
public void remove(Component c) {
throw new UnsupportedOperationException();
}
}
public class Leaf extends Component {
@Override
public void operation() {
System.out.println("Leaf");
}
}
public class Composite extends Component {
private final java.util.List<Component> children = new java.util.ArrayList<>();
@Override
public void operation() {
for (Component c : children) {
c.operation();
}
}
@Override
public void add(Component c) {
children.add(c);
}
@Override
public void remove(Component c) {
children.remove(c);
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Composite root = new Composite();
root.add(new Leaf());
root.add(new Leaf());
Composite comp = new Composite();
comp.add(new Leaf());
root.add(comp);
root.operation(); // 递归执行所有 Leaf
}
}

组合通过统一的 Component 接口和树形结构,让客户端以一致方式处理叶子与容器,适合“部分-整体”层次结构。