组合模式

[ Component ]

组合模式 又叫做 部分-整体模式

[
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
 2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
 3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
]


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


它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。


组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。
如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。


组 合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使 用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。



源码 :

// <summary>
// 接口(树根)
// </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);
}



// <summary>
// 树枝干(可以有子枝干或树叶)
// </summary>
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 (Component c in children)
    {
      c.Display(depth + 2);
    }
  }
}



// <summary>
// 树叶,不能再有子树叶
// 树叶不能有子树叶 , 之所以还集成接口 , 是为了方便被添加引用
// 保证和 Composite 对外的一致性 , 但是不会去具体实现
// </summary>
class Leaf : Component
{
  public Leaf(string name) : base(name) { }

  public override void Add(Component c)
  {
    Console.WriteLine("Cannot add to a leaf");
  }

  public override void Remove(Component c)
  {
    Console.WriteLine("Cannot remove to a leaf");
  }

  public override void Display(int depth)
  {
    Console.WriteLine(new String('-',depth)+name);
  }
}




class Program
{
  static void Main(string[] args)
  {

    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"));

    comp2.Add(comp2);


    root.Add(new Leaf("Leaf C"));

    Leaf leaf = new Leaf("Leaf D");
    root.Add(leaf);

    root.Remove(leaf);

    root.Display(1);

    Console.Read();
  }
}

posted on 2012-02-21 13:06  多个马甲  阅读(184)  评论(0编辑  收藏  举报