设计模式 – 组合模式

这个···我就懒得自己敲代码了

找了些代表性强的例子 可能也不是php写的

模式嘛用其他语言也没有啥关系 理解模式就好

组合模式的原则是局部类和组合类具有同样的接口。

特殊对象越来越多,组合模式开始渐渐显得弊大于利。

在大部分局部对象可互换的情况下,组合模式才最适用。

虽然组合模式是一个优雅的模式,但是它并不能将自身轻松的存储到关系数据库里。

如果你想像对待单个对象一样对待组合对象,那么组合模式才十分有用。

组合模式又依赖于其他组成部分的简单性。

随着我们引入复杂的规则,代码会变得越来越难以维护。

组合模式不能很好地在关系数据库中保存数据,但却非常合适使用XML持久化。

==============================

定义:将对象组合成树形结构,表示层次结构关系,并且让对象能够以同样的方式呈现给客户端程序。

举例:

家族谱的编写:

男性:可传宗接代,也有权利把一些人剔除族谱。

女性:记录到家谱中,但不能传宗接代。

理解:每一个小家庭中,爸爸妈妈和我,都是爸爸做主,可踢出我跟妈妈中的任何一个,也可增加任何一个。组件模式中的组件可以是单独一个对象组成,也可以是多个组件组成(一个家庭,甚至一个家庭的多级延续);

类图:

271817591881210.png

族员共性代码:

//// <summary>
    /// //族人 抽象出来的族人共性
    /// </summary>
    public abstract class Father
    {
        //族人的姓名
        protected string name = string.Empty;
        public string Name
        {
            get
            {
                return name;
            }
        }

        //增加后代
        public abstract void Add(Father boy);
        //逐出家谱
        public abstract void Remove(Father boy);

        //定义所有族人,做个简介
        public abstract void Intro();
    }

家族成员代码

//男性后代
    public class Boy : Father
    {
        //构造函数
        public Boy() { }
        public Boy(string Name)
        {
            this.name = Name;
        }

        List<Father> myFamily = new List<Father>();

        //自我简介
        public override void Intro()
        {
            Console.WriteLine("我是:{0};", Name);
            foreach (Father f in myFamily)
            {
                f.Intro();
            }
        }

        //增加后代
        public override void Add(Father boy)
        {
            myFamily.Add(boy);
        }

        //逐出家谱
        public override void Remove(Father boy)
        {
            myFamily.Remove(boy);
        }
    }

    //女性后代 
    public class Gril : Father
    {
        //构造函数
        public Gril() { }
        public Gril(string Name)
        {
            this.name = Name;
        }
        //自我简介
        public override void Intro()
        {
            Console.WriteLine("我是:{0};", Name);
        }
        //不能添加
        public override void Add(Father store)
        {
            throw new NotImplementedException();
        }
        //不能删除
        public override void Remove(Father store)
        {
            throw new NotImplementedException();
        }
    }

客户端代码:

public static void Main()
        {
            //爷爷取老婆
            Boy yeye = new Boy("爷爷");
            Gril nainai = new Gril("奶奶");
            yeye.Add(nainai);

            //爷爷要孩子
            Boy baba = new Boy("爸爸");
            Gril gugu = new Gril("姑姑");            
            yeye.Add(gugu);
            yeye.Add(baba);

            //爸爸要我
            Boy me = new Boy("me");
            baba.Add(me);

            //我要孩子
            Boy son = new Boy("son");
            me.Add(son);

            //爷爷的大家庭,族谱做介绍
            yeye.Intro();

            Console.Read();
        }

总结:

有组合模式的案例可知:客户端代码,很容易组建层次结构,并且层次分明,同时又很容易遍历所有的组件集合。但要注意理解组合模式中的节点与页,节点可删可加,页则不能增删。

大家都好好理解,消化下这个模式,想想都在哪里,种情况下能使这个模式的特性发挥的淋漓尽职。