一句话理解:组合模式把单个对象和对象集合抽象为同一种类型,让客户端用统一方式处理树形结构。
模式结构
- Component:叶子与组合节点的共同接口
- Leaf:没有子节点,执行实际操作
- Composite:保存子节点并把操作递归传播
Unity 的 Transform 层级、UI 树和行为树都具有类似结构,但只有在客户端通过统一抽象处理叶子与容器时,才完整体现组合模式。
C# 示例:技能条件树
使用方无需判断节点是叶子还是组合:
透明式与安全式接口
把
Add/Remove 放进公共 Component 接口,客户端更统一,但叶子节点会暴露无意义方法;只让组合节点提供子节点管理更安全,但调用方需要知道具体类型。示例采用后者。适用场景
- UI、场景或骨骼层级
- 技能条件、任务目标
- 行为树与表达式树
- 文件夹、菜单和组织结构
注意事项
必须明确父子节点的所有权,防止重复挂载和循环引用。递归很深时要关注栈深度;节点频繁变化时要考虑缓存失效和遍历成本。
小结
组合模式的价值是让调用方只面对“节点”,而不是不断区分“单项还是集合”。树的边界清楚时,它能显著简化递归业务。