在 Unity 开发中, 组合模式(Composite Pattern) 用于处理 “部分 - 整体”的树状结构关系, 它能让客户端(调用者)以统一的方式处理单个对象(叶子节点)和对象组合(复合节点), 无需区分两者的差异.
 

举个具体场景: UI层级管理

游戏中UI系统天然是树形结构:
  • 一个主面板(如背包面板)可能包含多个子面板(装备栏\道具栏).
  • 子面板又可能包含按钮\文本\图标等基础UI元素
 
如果要实现”显示/隐藏整个UI树” ”遍历所有UI元素执行操作”等功能, 直接区分“单个按钮”和”包含多个元素的面板” 会非常繁琐. 组合模式可以解决这个问题 ——— 让”单个元素” 和 “元素组合” 对外暴露统一接口, 客户端只需调用统一方法即可.
 

组合模式的核心角色

  1. 抽象组件(Component): 定义所有组件(叶子和复合节点)的共同接口(如显示\隐藏\添加子元素等).
  1. 叶子节点(Leaf): 没有子节点的基本元素(按钮\文本), 实现抽象组件的接口.
  1. 复合节点(Composite): 可以包含子节点(叶子或其他复合节点)的组合元素(如面板), 实现抽象组件的接口, 并管理子节点.
 

代码实现步骤

  1. 定义抽象组件(UI元素的统一接口)
先定义所有UI元素的共同行为(显示\隐藏\获取名称等), 以及复合节点特有的”子元素管理”方法(添加\移除子元素):
 
  1. 实现叶子节点(基础UI元素)
叶子节点是不能包含子元素的基础UI(如按钮\文本), 只需实现 Show / Hide 等核心方法,子元素管理方法可空实现:
 
  1. 实现复合节点(UI面板, 可包含子元素)
复合节点(如面板)可以包含其他UI元素(叶子或其他面板), 需要实现子元素管理方法, 并在 Show / Hide 时递归操作所有子元素:
 
  1. 客户端使用(统一操作UI树)
客户端无需区分”单个按钮”和”包含多个元素的面板”, 直接调用 Show / Hide 即可操作整个结构:
 

组合模式的核心优势

  1. 统一接口: 客户端用相同的代码处理单个元素(按钮)和组合元素(面板), 无需写 if(是面板){…} else if (是按钮){…} 这样的区分逻辑.
  1. 简化树形操作: 对复合节点执行 Show / Hide 时, 会自动递归操作所有子节点, 无需手动遍历整个UI树.
  1. 易于扩展: 新增UI元素(如”图标”) 只需继承 UIComponent 实现叶子节点; 新增组合元素 (如”滚动面板”) 只需继承 UIComponent 实现复合节点, 现有代码无需修改.
 

在 Unity 中的其他应用场景

  • 场景物体管理: 一个”关卡” 包含多个“区域”, 每个”区域”包含多个”敌人”和”道具”, 用组合模式统一激活 / 禁用整个关卡
  • 技能系统: 一个”组合技能”包含多个”子技能”, 用组合模式统一触发技能效果(组合技能触发时自动触发所有子技能).
  • 背包系统: “背包” 包含多个”物品栏”, 每个”物品栏”可放”装备”或”道具”, 用组合模式统一计算重量\清空背包等.
 
总结: 组合模式就像”文件夹与文件”的关系 ——— 你可以统一复制\删除一个文件或一个包含多个文件的文件夹, 无需关系它是单个元素还是组合. 在Unity中, 它是处理树形结构的”利器”