前言
点击查看:设计模式系列
组合模式(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();
}
组合模式总结
有组合模式的案例可知:客户端代码,很容易组建层次结构,并且层次分明,同时又很容易遍历所有的组件集合。但要注意理解组合模式中的节点与页,节点可删可加,页则不能增删。
大家都好好理解,消化下这个模式,想想都那里,那种情况下能使这个模式的特性发挥的淋漓尽职。