在Word文档中,我们经常会对一个字或者一段话进行设定它的大小、字体等属性;但很少停下来站在程序的角度,想想它是怎么样的原理?今天,我们就对此进行一个讲解。微软在设计的时候,应该是这样的:它把一个段话看成一个整体,而把单个字看成一个单独的部分;整体与部分之间的所有操作都是一样的,并用同一的方式进行调用(也就是说都是从同一个基类继承出来的)。在设计模式当中,我们把它叫组合模式。
如何定义?将对象组合成树形结构以表示“部分---整体”的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性。我们经常采用透明的组合模式;也就是说树叶类、树枝类都是从树根(基类)继承的;只是在树叶类中我们对有些方法的实现没有实际的意义,例如:不能对树叶添加树叶的操作。
基类代码,主要是声明了增、删、访问的方法;
abstract class Component { protected string name; public Component(string name) { this.name=name; } public abstract void Add(Component c); public abstract void Remove(Component c); public abstract void Display(int depth); }
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 Remove(Component c) { Console.WriteLine(new String('-',depth)+name); } }树枝类类定义了一个存储它具有哪些树叶、树枝的对象;并在访问的时候才有遍历的方式循环访问其数据;
class Composite:Component { private List<Component> children=new List<Component>(); public override void Add(Component c) { children.Add(c); } public override void Remove(Component c) { children.Remove(c); } public override void Remove(Component c) { Console.WriteLine(new String('-',depth)+name); foreach(Component tmp in children) { tmp.Display(depth+2); } } }
//客户端代码 static void Main(string[] arg) { Composite A=new Composite("A"); //为A添加叶子节点 A.Add(new Leaf("叶子A")); Composite B=new Composite("B"); B.Add(new Leaf("叶子B")); //为A添加树枝节点 A.Add(B); }
原文地址:http://blog.csdn.net/sevenkj/article/details/43670463