组合 (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
Java 示例
Section titled “Java 示例”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 接口和树形结构,让客户端以一致方式处理叶子与容器,适合“部分-整体”层次结构。