组合模式

   单一职责原则

    定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 

   里氏替换原则

    定义:所有引用基类的地方必须能透明地使用其子类的对象。

   依赖倒置原则

    定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

   接口隔离原则

    定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 

   迪米特法则

    定义:一个对象应该对其他对象保持最少的了解。

   开闭原则

    定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

  

  我们首先来看一下组合模式的定义: 将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性

    也就是说需要为单个和组合对象提供统一的接口来访问

      那么一个实际的问题来源是什么?

     就像文本编辑一样,你可以一个一个的改变字的颜色,粗细,字体,也可以一段一段的修改,也就是部分和整体一样的情况

      那下面我们就来看一个例子:

    我们就来实现如上面这个例子:

      当然这个模式主要用的也是运行时的多态,具体思路如下:

        由于,局部和整体的操作一直,所有就可以抽象出一个夫类,夫类里面有他们一致的方法

    abstract class root
    {
        protected root rot=null;
        protected virtual string name { get; set; }
       public abstract void add(root t);
       public abstract void show(int depth);//depth深度
        public root(string name)
       {
           this.name = name;
       }
    }

  然后就是"树根"了

    class shucha:root//树杈
    {
       private List<root> Troot = new List<root>();
        public shucha(string name) : base(name) { }
        public override void add(root t)
        {
            Troot.Add(t);
        }
        public override void show(int depth)
        {
            Console.WriteLine(new string('-', depth) + this.name);
            foreach (root item in Troot)
            {
                item.show(depth+2);
            }
        }
    }

  然后就是"树叶"了

    class shuyei:root//树叶
    {
        public shuyei(string name) : base(name) { }
        public override void add(root t){}
        public override void show(int depth)
        {
            Console.WriteLine(new string('-',depth)+this.name);
        }
    }

  然后就可以执行了

        static void Main(string[] args)
        {
            shucha s = new shucha("主树根");
            s.add(new shuyei("我是树叶一"));
            s.add(new shuyei("我是树叶二"));
            shucha s1 = new shucha("我是次树根");
            s.add(s1);
            s1.add(new shuyei("我是树叶三"));
            s1.add(new shuyei("我是树叶四"));
            s.show(1);
            Console.Read();
        }
    }

 

 

posted @ 2016-12-02 09:13  夏风微凉  阅读(212)  评论(0编辑  收藏  举报