Unity Come On

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

2019-01-28  本文已影响43人  su9257_海澜

前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了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);
    }

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

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

上一篇下一篇

猜你喜欢

热点阅读