在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);
}
咱们在实际项目开发中也会用到这个模式,例如:总公司的网站各模式的功能应用到分公司中。