Java组合模式通过抽象组件接口统一叶子与容器节点,Leaf专注业务实现、不持子节点,Composite持子集并递归委托,客户端面向接口编程实现一致调用。

Java中接口在组合模式里统一叶子节点和容器节点,关键在于定义一个抽象组件接口(Component),让Leaf和Composite都实现它,从而屏蔽二者差异,使客户端调用方式完全一致。
定义统一接口,声明公共行为
接口应聚焦于所有节点共有的业务操作(如display()、count()、operate()),不强求每个方法对所有节点都有意义。是否把add()/remove()等管理方法也放进接口,取决于你选透明式还是安全式实现:
- 透明式:Component接口声明全部方法(包括add、remove、getChild)。Leaf类需提供空实现或抛UnsupportedOperationException,保证编译通过,但运行时可能出错
- 安全式:Component只定义真正共用的方法(如operation()、count())。add/remove等由Composite单独提供——这样Leaf不用实现无关逻辑,更健壮,但客户端需判断类型才能调用管理操作
Leaf实现接口:专注自身行为
Leaf类代表终端对象(如文件、员工、菜单项),它:
- 只实现业务方法(例如public void operation() { System.out.println("处理单个文件"); })
- 对管理类方法可选择:直接抛异常、空实现、或返回this(若接口要求非void返回值)
- 不持有子节点,也不参与递归委托
Composite实现接口:持子集 + 递归委托
Composite类代表分支节点(如文件夹、部门、菜单组),它:
立即学习“Java免费学习笔记(深入)”;
- 内部维护List<Component> children,可添加Leaf或其他Composite
- 业务方法(如operation())遍历children并递归调用child.operation()
- 管理方法(add/remove/getChild)直接操作children列表
- 天然支持无限嵌套,树形结构由Composite动态构建
客户端代码保持简洁一致
客户端只需面向Component接口编程,无需instanceof判断:
- 统一调用component.operation() → Leaf打印自己,Composite触发整棵子树
- 统一调用component.count() → Leaf返回固定值,Composite累加所有子节点count()
- 新增节点时,add()调用只对Composite生效(透明式下Leaf会报错;安全式下根本没这个方法)


















