Composite Pattern

问题:

当使用遍历方法对一个集合对象遍历时, 如果这个集合包含的不仅仅是"项", 也可能包含另一个集合, 那么对"项"的遍历方法在集合上可能不通用

所以:

我们将 集合 和 项 都进行统一对待.

为它们都建造相同的方法, 已达到在遍历或者其他操作中不需要考虑 集合 当中时候含有不一样的元素

public abstract class MenuComponent
{
    // 菜单组
    // 其中可能包含 菜单项 或者是 子菜单组

    public void add(MenuComponent comp) 
    {
        // 对 菜单项来说, add 方法没什么意义
        // 对 菜单组来说, add 可以新插入一个 菜单 或者 菜单项
    }
    public void print()
    {
        // 对 菜单项 来说, 可能 print 就是打印所有的信息
        // 但对 自菜单组来说, 打印可能就是菜单名
    }

    // more
}
public class MenuItem : MenuComponent
{
    public void add(MenuComponent comp)
    {
        throw new Exception();
    }

    public void print()
    {
        // 如果是菜单项 直接打印
        Console.WriteLine();
    }
}
 public class Menu : MenuComponent
 {
     // 其中可能包含 菜单组 或者 菜单项
     Array<MenuComponent> array = new Array<MenuComponent>();

     public void add(MenuComponent comp)
     {
         array.add(comp);
     }

     public void print()
     {
         foreach(var i in array){
             // 如果是菜单组
             // 则打印其中的子项
         }
     }
 }

 

结论:

组合模式用于 操作类似于 树形结构的对象, 将树形结构中存在于不同类型的子项用相同的方式对待.

如果某个对象不适用于其中的某个方法, 则可以使用抛出异常来处理

posted @ 2015-11-30 20:15  `Laimic  阅读(95)  评论(0)    收藏  举报