组合模式用统一component接口抽象叶子与容器节点,leaf实现业务方法并忽略子节点操作,composite维护子节点列表并递归委托;客户端仅调用根节点operation()即可自动遍历整棵树。

Java 中组合模式(Composite Pattern)处理树形结构对象,核心是用统一接口抽象“单个元素”和“容器元素”,让客户端无需区分叶子节点与分支节点,递归调用即可遍历或操作整棵树。
统一接口定义公共行为
所有节点——无论是叶子(如文件)还是容器(如目录)——都实现同一个抽象构件 Component 接口。该接口声明业务方法(如 operation())以及管理子节点的方法(如 add()、remove()、getChild())。
- 透明式实现:所有方法都在
Component中声明,Leaf类需提供空实现或抛异常(例如对add()抛UnsupportedOperationException) - 安全式实现:仅在
Composite中定义管理子节点的方法,Leaf不含这些方法,类型更安全,但客户端需先判断节点类型再调用
叶子节点只负责自身逻辑
Leaf 类代表树的末端,没有子节点。它实现 Component 的业务方法(如打印自身名称、执行计算),而对增删子节点等操作不做实际处理。
- 例如:一个
TextFile叶子类,operation()输出“打开文本文件”,add()直接抛异常 - 不持有子节点集合,内存开销小,职责单一
容器节点递归委托子节点
Composite 类维护一个 List<component></component> 存储子节点,它的 operation() 方法不是自己执行,而是遍历每个子节点并调用其 operation() ——形成自然递归。
- 添加/删除子节点时,直接操作内部列表
- 获取子节点、遍历子树、统计节点数、查找匹配项等操作,均可基于该列表展开
- 客户端调用根节点的
operation(),自动穿透到所有子孙节点
客户端完全 unaware 节点类型
客户端代码只依赖 Component 接口,创建混合结构时可自由组合:
- 新建一个
Composite表示“项目目录”,add()一个TextFile、一个ImageFile、另一个嵌套的Composite(如“资源子目录”) - 调用该项目目录的
operation(),自动触发所有子项行为,无需 if-else 判断类型 - 后续新增节点类型(如
VideoFile)只需实现Component,不影响现有调用逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











