初学者,自用笔记

用于把对象组织成树形结构来表示“整体-部分”的层次关系,使客户端能用一致的方式对待单个对象(叶子)和组合对象(容器)

常用于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();
    }
}