🌳
一句话理解:组合模式把单个对象和对象集合抽象为同一种类型,让客户端用统一方式处理树形结构。

模式结构

  • Component:叶子与组合节点的共同接口
  • Leaf:没有子节点,执行实际操作
  • Composite:保存子节点并把操作递归传播
Unity 的 Transform 层级、UI 树和行为树都具有类似结构,但只有在客户端通过统一抽象处理叶子与容器时,才完整体现组合模式。

C# 示例:技能条件树

使用方无需判断节点是叶子还是组合:

透明式与安全式接口

Add/Remove 放进公共 Component 接口,客户端更统一,但叶子节点会暴露无意义方法;只让组合节点提供子节点管理更安全,但调用方需要知道具体类型。示例采用后者。

适用场景

  • UI、场景或骨骼层级
  • 技能条件、任务目标
  • 行为树与表达式树
  • 文件夹、菜单和组织结构

注意事项

必须明确父子节点的所有权,防止重复挂载和循环引用。递归很深时要关注栈深度;节点频繁变化时要考虑缓存失效和遍历成本。

小结

组合模式的价值是让调用方只面对“节点”,而不是不断区分“单项还是集合”。树的边界清楚时,它能显著简化递归业务。