组合模式:将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得用户对单个对象和组合对象具有一致性
使用组合模式的场景:当需求中体现部分和整体层次的结构时候,希望用户可以忽略组合对象和当对象的不同,统一的使用组合结构中的所有对象的时候,就应该考虑组合模式。
组合模式可以让用户无差别的时候组合结构和单个对象。
图示:
/// <summary>
/// component为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为
/// 声明一个接口用于访问和管理component的子部件
/// </summary>
public abstract class Componet
{
protected string name;
public Componet(string name)
{
this.name = name;
}
public abstract void Add(Componet com);
public abstract void Remove(Componet com);
public abstract void DIsplay(int depth);
}
/// <summary>
/// Leaf在组合中表示叶节点对象,叶节点没有子节点
/// </summary>
public class Leaf : Componet
{
public Leaf(string name)
: base(name)
{
}
public override void Add(Componet com)
{
Console.WriteLine("Can not add to a leaf");
}
public override void Remove(Componet com)
{
Console.WriteLine("can not remove from a leaf");
}
public override void DIsplay(int depth)
{
Console.WriteLine(new String('-',depth) + name);
}
}
/// <summary>
/// composite定义枝节点行为,
/// </summary>
public class Composite : Componet
{
/// <summary>
/// 一个子对象集合用来存储其下属的枝节点和叶子节点
/// </summary>
private List<Componet> list = new List<Componet>();
public Composite(string name) : base(name) { }
public override void Add(Componet com)
{
list.Add(com);
}
public override void Remove(Componet com)
{
list.Remove(com);
}
/// <summary>
/// 显示节点名称,并对下级遍历
/// </summary>
/// <param name="depth"></param>
public override void DIsplay(int depth)
{
Console.WriteLine(new String('-',depth)+name);
foreach (Componet com in list)
{
com.DIsplay(depth + 2);
}
}
}
/// <summary>
/// 客户端调用
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp = new Composite("composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
root.DIsplay(1);
Console.Read();
}
其中的叶子简单完全没必要实现add和remove方法,因为叶子简单不能有子集,但是必须继承component类,实现其中的抽象方法,这样做完全是为了保证枝节点和叶子简单具有完全一样的结构,使外界不用区分它们
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。