美文网首页Unity Come On
Unity【话大】设计模式之组合模式

Unity【话大】设计模式之组合模式

作者: su9257_海澜 | 来源:发表于2019-01-28 22:48 被阅读43次

    前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了

    在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略



    有说的不正确或者不准确的地方欢迎留言指正


    有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力



    今天跟大家介绍一下组合模式,这种模式笔者理解为递归调用的扩展。

    组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    示例相对简单,其实就是一个树状的结构,有一个主干,然后就是分支,每个分支可能是叶子节点,也可能是含有子分支的节点。下面笔者就直接展示相关的示例代码了

    首先我们先创建一个几点的抽象基类 ,也就是每个节点基类

        public abstract class CompsiteBase
        {
            protected string name;
    
            public CompsiteBase(string name)
            {
                this.name = name;
            }
    
            public abstract void Add(CompsiteBase c);
            public abstract void Remove(CompsiteBase c);
            public abstract void Display(int depth);
        }
    

    叶子节点,也就是不含子节点的分支

        public class Leaf : CompsiteBase
        {
            public Leaf(string name)
                : base(name)
            { }
    
            public override void Add(CompsiteBase c)
            {
                this.Log("Cannot add to a leaf");
            }
    
            public override void Remove(CompsiteBase c)
            {
                this.Log("Cannot remove from a leaf");
            }
    
            public override void Display(int depth)
            {
                this.Log(new String('-', depth) + name);
            }
        }
    

    含有子节点的分支

        public class Composite : CompsiteBase
        {
            private List<CompsiteBase> children = new List<CompsiteBase>();
    
            public Composite(string name)
                : base(name)
            { }
    
            public override void Add(CompsiteBase c)
            {
                children.Add(c);
            }
    
            public override void Remove(CompsiteBase c)
            {
                children.Remove(c);
            }
    
            public override void Display(int depth)
            {
                this.Log(new String('-', depth) + name);
    
                foreach (CompsiteBase compsite in children)
                {
                    compsite.Display(depth + 2);
                }
            }
        }
    

    示例调用

        void Start()
        {
            Composite root = new Composite("root");
            root.Add(new Leaf("Leaf A"));
            root.Add(new Leaf("Leaf B"));
    
            Composite comp = new Composite("Composite X");
            comp.Add(new Leaf("Leaf XA"));
            comp.Add(new Leaf("Leaf XB"));
    
            root.Add(comp);
    
            Composite comp2 = new Composite("Composite XY");
            comp2.Add(new Leaf("Leaf XYA"));
            comp2.Add(new Leaf("Leaf XYB"));
    
            comp.Add(comp2);
    
            root.Add(new Leaf("Leaf C"));
    
            Leaf leaf = new Leaf("Leaf D");
            root.Add(leaf);
            root.Remove(leaf);
    
            root.Display(1);
        }
    

    组合模式也分为透明模式安全模式

    • 安全模式,在抽象基类中没有提供 Add Remove等管理子节点的方法,优点:就是不必实现不需要的相关函数,缺点:就是需要区分叶子节点和含有子节点的分支,进行分别调用
    • 透明模式 与安全模式相反,含有对应管理子节点的函数,优点可以统一的调用,缺点容易错误调用先关的管理函数引发异常

    当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽律组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。

    相关文章

      网友评论

        本文标题:Unity【话大】设计模式之组合模式

        本文链接:https://www.haomeiwen.com/subject/uwmgjqtx.html