组合模式(Composite Pattern) 是一种 结构型设计模式,用于将对象组合成树形结构以表示 “部分-整体” 的层次关系。它使得客户端可以 统一处理单个对象和组合对象,无需关心具体是叶子节点还是容器节点。
1. 核心角色
角色 | 说明 |
---|---|
组件接口(Component) | 定义所有对象的通用接口(叶子节点和容器节点的共同行为)。 |
叶子节点(Leaf) | 实现组件接口,表示树中的叶子对象(没有子节点)。 |
容器节点(Composite) | 实现组件接口,包含子组件集合,并提供管理子组件的方法(如添加、删除)。 |
2. 代码示例:文件系统
模拟文件系统中的文件和文件夹结构,文件夹可以包含文件或其他文件夹。
步骤1:定义组件接口(FileSystemComponent)
步骤2:实现叶子节点(File)
步骤3:实现容器节点(Directory)

步骤4:客户端调用
输出结果
3. 组合模式类图
4. 组合模式优缺点
优点 | 缺点 |
---|---|
简化客户端代码,统一处理叶子与容器。 | 违反接口隔离原则(叶子节点被迫实现无关方法,如add() )。 |
灵活扩展,新增组件类型不影响现有代码。 | 设计较复杂,需区分叶子与容器节点。 |
5. 组合模式 vs. 装饰器模式
模式 | 目的 | 结构 |
---|---|---|
组合模式 | 处理树形结构,统一叶子与容器操作。 | 树形层次结构,包含子节点。 |
装饰器模式 | 动态添加对象功能,增强原有行为。 | 链式结构,包裹被装饰对象。 |
6. 实际应用场景
-
GUI 组件树:如 Java Swing 中的
JComponent
(容器)和JButton
(叶子)。 -
组织结构管理:公司部门与员工的关系。
-
XML/JSON 解析:处理嵌套的节点结构。
-
菜单系统:支持多级菜单项和子菜单。
总结
组合模式通过 树形结构 和 统一的组件接口,实现了对单个对象和组合对象的一致性处理。适用于需要表示 部分-整体层次结构 的场景,能够显著提升代码的 可扩展性 和 可维护性。实际开发中需注意避免叶子节点被迫实现冗余方法(可通过接口分离优化)。