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();
    }
}
全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务