《设计模式与游戏完美开发》——第十二周读书笔记

Gof对于组合模式的定义是:
“将对象以树状结构组合,用以表现部分-全体的层次关系。组合模式让客户端在操作各个对象或者组合对象时是一致的。”
Gof的组合模式中说明,它使用“树状结构”来组合各个对象,所以实现时也包含了“根节点”与“叶节点”的概念。而“根节点”中野会包含“叶节点”的对象,所以当根节点被删除时,叶节点也会被一起删除,并且希望对于“根节点”和“叶节点”在操作方法上能够一致。这表示,这两种节点都是继承自同一个操作界面,能够对根节点调用的操作,同样能够在叶节点上使用。
结构图如下:
在这里插入图片描述

GOF的参与者说明如下:
Compoent(组件界面):定义树状结构中每一个结构可以使用的方法。
Composite(组合节点):根节点、父节点;包含叶节点,会实现Compoent里面的方法。
Leaf(叶节点):不再包含任何子节点的最终节点;实现Compoent(组件界面)的方法,与子节点有关可以不实现,也可以报警告。
这样看起来是不是有点像unity里面的代码:transform.Getcompent<T>()....这种类似的,因为unity正是采用这种方法布局整个场景的。场景树就是以transform为基础搭建的,你可以发现每一个节点都有一个transform。
组合模式的实现范例:

public abstract class ICompoent
    {
        protected string m_Value;
        //一般操作
        public abstract void Operation();
        
        //加入节点
        public virtual void Add(ICompoent theCompoent)
        {
            Console.WriteLine("子类没实现");
        }
        //移除节点
        public virtual void Remove(ICompoent theCompoent)
        {
            Console.WriteLine("子类没实现");
        }
        public  virtual ICompoent GetChild(int index)
        {
            Console.WriteLine("子类没实现");
            return null;
        }
    }
    public class Composite:ICompoent
    {
        List<ICompoent> m_childs = new List<ICompoent>();
        public Composite(string value)
        {
            m_Value = value;
        }
        //一般操作
        public override void Operation()
        {
            Console.WriteLine("Composite[" + m_Value+"]");
            foreach(ICompoent compoent in m_childs)
            {
                compoent.Operation();
            }
        }
        //加入节点
        public override void Add(ICompoent theCompoent)
        {
            m_childs.Add(theCompoent);
        }
        //删除节点
        public override void Remove(ICompoent theCompoent)
        {
            m_childs.Remove(theCompoent);
        }
        //获取子节点
        public override ICompoent GetChild(int index)
        {
            return m_childs[index];
        }
    }
    public class Leaf : ICompoent
    {
        public Leaf(string value)
        {
            m_Value = value;
        }
        public override void Operation()
        {
            Console.WriteLine("Leaf[" + m_Value + "]执行opreation()");
        }
    }

然后就是按照上面这三个类进行创建根节点、父节点、叶节点,然后进行操作测试。
最后说一点,这个模式多半是用于界面设计的,因为玩家是通过ui界面与游戏系统进行交互的,而这些界面其实就是可以看做一个层级关系,最经典的操作就是“红点系统”的设计,充分的利用了树状结构、部分与整体的关系,大家有兴趣可找找。
以上就是本周的读书笔记。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风萧水寒人往前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值