这个···我就懒得自己敲代码了
找了些代表性强的例子 可能也不是php写的
模式嘛用其他语言也没有啥关系 理解模式就好
组合模式的原则是局部类和组合类具有同样的接口。
特殊对象越来越多,组合模式开始渐渐显得弊大于利。
在大部分局部对象可互换的情况下,组合模式才最适用。
虽然组合模式是一个优雅的模式,但是它并不能将自身轻松的存储到关系数据库里。
如果你想像对待单个对象一样对待组合对象,那么组合模式才十分有用。
组合模式又依赖于其他组成部分的简单性。
随着我们引入复杂的规则,代码会变得越来越难以维护。
组合模式不能很好地在关系数据库中保存数据,但却非常合适使用XML持久化。
==============================
定义:将对象组合成树形结构,表示层次结构关系,并且让对象能够以同样的方式呈现给客户端程序。
举例:
家族谱的编写:
男性:可传宗接代,也有权利把一些人剔除族谱。
女性:记录到家谱中,但不能传宗接代。
理解:每一个小家庭中,爸爸妈妈和我,都是爸爸做主,可踢出我跟妈妈中的任何一个,也可增加任何一个。组件模式中的组件可以是单独一个对象组成,也可以是多个组件组成(一个家庭,甚至一个家庭的多级延续);
类图:
族员共性代码:
//// <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(); }
总结:
有组合模式的案例可知:客户端代码,很容易组建层次结构,并且层次分明,同时又很容易遍历所有的组件集合。但要注意理解组合模式中的节点与页,节点可删可加,页则不能增删。
大家都好好理解,消化下这个模式,想想都在哪里,哪种情况下能使这个模式的特性发挥的淋漓尽职。