设计模式之组合模式
名词解释:
组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
必需元素:
1.组合中的对象的接口(Component),在适当情况下,实现所有类共有接口的默认行为。在类中定义一些用于访问和管理Component子部件;
2.在组合中表示叶节点对象的类(叶节点木有子节点);
3.定义有枝节点行为,可以存储子部件的类。(会实现Component中关于子部件操作的方法,一般为Add和Remove)
上例子:
Component,节点抽象类:
/// <summary> /// 部件的抽象类 /// </summary> abstract class Component { protected string name; public Component(string name) { this.name = name; } /// <summary> /// 添加节点 /// </summary> /// <param name="c"></param> public abstract void Add(Component c); /// <summary> /// 移除节点 /// </summary> /// <param name="c"></param> public abstract void Remove(Component c); /// <summary> /// 显示节点 /// </summary> /// <param name="depth"></param> public abstract void Display(int depth); }
Leaf,没有子节点的部件:
class Leaf:Component { public Leaf(string name) : base(name) { } public override void Add(Component c) { Console.WriteLine("不能增加枝点"); } public override void Remove(Component c) { Console.WriteLine("不能移除枝点"); } public override void Display(int depth) { Console.WriteLine(new string('-',depth)+name); } }
Composite,有子节点操作的部件:
class Composite:Component { //用来存储子部件的集合 private List<Component> children = new List<Component>(); public Composite(string name) : base(name) { } public override void Add(Component c) { children.Add(c); } public override void Remove(Component c) { children.Remove(c); } public override void Display(int depth) { //显示当前节点的信息 Console.WriteLine(new string('-',depth)+name); //遍历其子节点 foreach (var item in children) { item.Display(depth+2); } } }
调用:
//定义一个更节电 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); Composite comp2 = new Composite("Composite XY"); comp2.Add(new Leaf("Leaf XYA")); comp2.Add(new Leaf("Leaf XYB")); //向子节点中添加含有子节点的节点 comp.Add(comp2); root.Add(new Leaf("Leaf C")); //显示根节点 root.Display(1); Console.Read();
总结:
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式。组合模式的好处是用户不用关心到底是处理一个节点还是处理一个组合组建,也就不用为定义组合而写一些判断,也就是说组合模式让客户可以一致地使用组合结构和单个对象。