组合模式通过抽象构件接口统一叶子与容器节点操作,客户端无需区分类型即可一致处理树形结构;叶子节点实现基础行为并忽略管理逻辑,容器节点递归委托子节点执行操作。

组合模式通过抽象构件(Component)统一叶子节点和容器节点的接口,让客户端无需区分类型,直接对整个树形结构做一致操作。
定义统一的抽象构件接口
这是统一处理的前提。抽象构件声明所有节点共有的行为方法,比如 display()、getSize() 或业务方法如 killVirus()。它不强制要求所有方法都适用于叶子节点,但提供统一入口。例如:
- 接口中只放叶子和容器都该实现的方法(如展示、计算大小、执行核心逻辑)
- 管理类方法(如 add()、remove()、getChild())可按需设计:要么默认抛异常(透明式),要么只在容器中定义(安全式)
- 客户端代码始终面向这个抽象接口编程,比如 Component node = new File(...) 或 Component folder = new Folder(...)
叶子节点实现基础行为,忽略管理逻辑
叶子节点(如文件)只专注自身职责,不参与子节点管理:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现 display() 就是打印自己,getSize() 返回自身大小
- 若采用透明式设计,add()/remove() 等方法可抛 UnsupportedOperationException,或输出提示信息
- 若采用安全式设计,这些方法根本不出现在叶子类中,编译期就杜绝误调用
容器节点递归委托,自动穿透整棵树
容器节点(如文件夹)持有子节点列表,并在自己的方法中遍历调用子节点对应方法:
- 调用 display(0) 时,先打印自己,再对每个子节点调用 display(indent + 2)
- 计算总大小时,累加所有子节点的 getSize() 结果
- 执行杀毒操作时,先处理自己,再递归调用每个子节点的 killVirus()
- 这种递归机制让一次调用自动覆盖整棵子树,客户端完全不用写循环或判断逻辑
客户端只需关注行为,不关心节点类型
真正体现“统一处理”的地方在于客户端代码极度简洁:
- 可以传入任意 Component 实例——不管是 File 还是 Folder,都调用同一套方法
- 构建树时自由嵌套:Folder 可加 File,也可加另一个 Folder,层次无限
- 新增节点类型(如加密文件、压缩包)只要实现 Component 接口,现有逻辑全兼容
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










