结合模式的详解

组合模式的详解

      在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);
}

     咱们在实际项目开发中也会用到这个模式,例如:总公司的网站各模式的功能应用到分公司中。