首页 > 代码库 > 设计模式-组合模式

设计模式-组合模式

前言

点击查看:设计模式系列

组合模式(Composite)

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

举例:

家族谱的编写:

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

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

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

类图:

族员共性代码:

   //// <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();        }

组合模式总结

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

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

欢迎加入博客左上方群,交流探讨,设计模式,数据库,c#.net,数据结构。

 

设计模式-组合模式