设计模式学习笔记-组合模式

概述:                                                                                                      

将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite"使得用户对单个对象和组合对象的使用具有一致性。

适用场合:                                                                                                 

1.你想用部分-整体结构层次。

2.你希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。

类图:                                                                                                       

代码示例:                                                                                                    

1.定义一个组件接口,无论是叶子和树枝都继承它。

    /// <summary>
/// 为组合中的对象声明接口,在适当情况下,实现所有类公有接口的的默认行为。
/// 声明一个接口用于访问和管理Component的子部件
/// </summary>
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);
}

2.定义叶子,但是这里给出了叶子的无意义的add和reomove方法

    class Leaf:Component
{
public Leaf(string name):base(name){}

/// <summary>
/// 由于叶子没增加树枝的能力,所以add和remove方法实现它是没有意义的
/// 但这样可以消除叶节点和枝节点在抽象层次的区别,他们具备完全一致的接口
/// </summary>
/// <param name="c"></param>
public override void Add(Component c)
{
Console.WriteLine(
"Cannot add to a Leaf");
}
public override void Remove(Component c)
{
Console.WriteLine(
"Cannot remove from a leaf"); ;
}
/// <summary>
/// 叶节点的具体方法,此处显示其名称和级别
/// </summary>
/// <param name="depth"></param>
public override void Display(int depth)
{
Console.WriteLine(
new String('-',depth)+name);
}
}

3.定义枝节点

    /// <summary>
/// 定义有行为的枝节点,用来存储子部件,在Componet接口中实现与子部件有关的操作,
/// 比如add和remove
/// </summary>
class Composite:Component
{
/// <summary>
/// 一个子对象集合用来存储其下属的枝节点和叶节点
/// </summary>
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);
}
/// <summary>
/// 显示其枝节点名称,并对其下级进行遍历
/// </summary>
/// <param name="depth"></param>
public override void Display(int depth)
{
Console.WriteLine(
new String('-',depth)+name);
foreach(Component ct in children)
{
ct.Display(depth
+2);
}
}
}

4,客户端展示小树的生长过程

        /// <summary>
/// 测试组合模式
/// </summary>
static void TestComposite()
{
///生成树根,根上长出两片叶子
Composite root = new Composite("root");
root.Add(
new Leaf("Leaf A"));
root.Add(
new Leaf("Leaf B"));

///根上长出分支X,分支上又长了两片叶子
Composite comp = new Composite("Composite X");
comp.Add(
new Leaf("Leaf XA"));
comp.Add(
new Leaf("Leaf XB"));
root.Add(comp);

//分支X上又长出了XY分支,分支上又生了两片嫩叶
Composite comp2 = new Composite("Composite XY");
comp2.Add(
new Leaf("Leaf XYA"));
comp2.Add(
new Leaf("Leaf XYB"));
root.Add(comp2);

///根部又长出两片叶子,但是一个叶子D掉落了
root.Add(new Leaf("Leaf C"));
Leaf leaf
= new Leaf("Leaf D");
root.Add(leaf);
root.Remove(leaf);

//从1开始往下遍历,显示整个小树的样子
root.Display(1);
Console.Read();


}

小结:                                                                                                       

在System.Web.UI.Control类里面就有Add和Remove方法,也是组合模式的经典应用,但是没有具体查证,希望大家学习的时候能查证一下。

posted @ 2011-08-30 10:58  叶鹏  阅读(737)  评论(0编辑  收藏  举报