C# 设计模式系列教程-组合模式

2019-12-30 12:34:31王振洲

  4.3 客户端代码


  class Program
  {
    static void Main(string[] args)
    {
      // 生成树根,并为其增加两个叶子节点
      Component root = new Composite("Root");
      root.Add(new Leaf("Leaf A in Root"));
      root.Add(new Leaf("Leaf B in Root"));

      // 为根增加两个枝节点
      Component branchX = new Composite("Branch X in Root");
      Component branchY = new Composite("Branch Y in Root");
      root.Add(branchX);
      root.Add(branchY);

      // 为BranchX增加页节点
      branchX.Add(new Leaf("Leaf A in Branch X"));

      // 为BranchX增加枝节点
      Component branchZ = new Composite("Branch Z in Branch X");
      branchX.Add(branchZ);

      // 为BranchY增加叶节点
      branchY.Add(new Leaf("Leaf in Branch Y"));

      // 为BranchZ增加叶节点
      branchZ.Add(new Leaf("Leaf in Branch Z"));

      // 显示树
      root.Display(1);

      Console.Read();
    }
  }

  运行结果

C#,设计模式,组合模式

5. 透明方式与安全方式

  5.1 透明方式:在Component中声明所有来管理子对象的方法,其中包括Add,Remove等。这样实现Component接口的所有子类都具备了Add和Remove方法。这样做的好处是叶节点和枝节点对于外界没有区别,它们具备完全一致的接口。

  5.2 安全方式:在Component中不去声明Add和Remove方法,那么子类的Leaf就不需要实现它,而是在Composit声明所有用来管理子类对象的方法。

  5.3 两种方式有缺点:对于透明方式,客户端对叶节点和枝节点是一致的,但叶节点并不具备Add和Remove的功能,因而对它们的实现是没有意义的;对于安全方式,叶节点无需在实现Add与Remove这样的方法,但是对于客户端来说,必须对叶节点和枝节点进行判定,为客户端的使用带来不便。

6. 模式总结

  6.1 优点

    6.1.1 使客户端调用简单,它可以一致使用组合结构或是其中单个对象,简化了客户端代码。

    6.1.2 容易在组合体内增加对象部件。客户端不必因加入了新的部件而更改代码。有利于功能的扩展。