Unity 组合模式
初学者,自用笔记
用于把对象组织成树形结构来表示“整体-部分”的层次关系,使客户端能用一致的方式对待单个对象(叶子)和组合对象(容器)
常用于UI框架、行为树......
- Component:抽象组件,定义统一操作,可选定义增删子节点接口。
- Leaf:叶子节点,没有子节点,实现基本行为。
- Composite:组合节点,内部维护子节点集合,自己实现行为时通常会递归/迭代调用子节点行为。
简单例子
Component
// 统一接口
public interface IUiNode
{
void Show();
void Hide();
void Dispose();
}
Leaf
// 只管理一个具体的 GameObject,把显示/隐藏操作封装起来。
public sealed class UiLeaf : IUiNode
{
private readonly GameObject _go;
public UiLeaf(GameObject go)
{
_go = go;
}
public void Show()
{
if (_go != null) _go.SetActive(true);
}
public void Hide()
{
if (_go != null) _go.SetActive(false);
}
public void Dispose()
{
//统一释放入口(例如解绑按钮事件、停止协程、回收到对象池等)
}
}
Composite
// 组合节点。内部维护一组 IUiNode(可以是 UiLeaf,也可以是 UiGroup)
// 对外提供同样的 Show/Hide/Dispose,实现递归地批量控制整棵UI树
public sealed class UiGroup : IUiNode
{
private readonly List<IUiNode> _children = new List<IUiNode>();
// 把子节点挂到当前组里,返回自身以便链式 Add(...).Add(...)
public UiGroup Add(IUiNode child)
{
if (child != null) _children.Add(child);
return this;
}
// 作用:对组内所有子节点执行 Show(如果子节点还是组,会继续向下递归)
public void Show()
{
for (int i = 0; i < _children.Count; i++)
_children[i].Show();
}
// 作用:对组内所有子节点执行 Hide
public void Hide()
{
for (int i = 0; i < _children.Count; i++)
_children[i].Hide();
}
// 作用:统一释放整组资源(递归 Dispose),并清空子节点引用
public void Dispose()
{
for (int i = 0; i < _children.Count; i++)
_children[i].Dispose();
_children.Clear();
}
}
