zoukankan      html  css  js  c++  java
  • Composite模式学习

    using System;
    using System.Collections;
    namespace Composite
    {
     public interface IBox
     {
      void process();
     }
     public class SingleBox:IBox
     {
      public void process()
      {
      }
     }
     public class ContainerBox:IBox
     {
      public void process()
      {
       // TODO:  添加 ContainerBox.process 实现
      }
      public void Add(IBox box)
      {
       if(list==null)
       {
        list=new ArrayList();
       }
       list.Add(box);
      }
      public void Romove(IBox box)
      {
       if (list==null)
       {
        throw new Exception();
       }
       list.Remove(box);
      }
      public ArrayList getBoxes()
      {
      }
     }

     /// <summary>
     /// //////////////客户代码
     /// </summary>
     class App
     {
      public static void Main()
      {
       IBox=Facory.GetBox();

       //客户代码与对象内部结构发生了耦合
       if(box is ContainerBox)
       {
        box.process();
        ArrayList list=((ContianerBox)box).GetBoxes();
        //...
       }
       else if(box is SingleBox)
       {
        box.process();
       }
      }
     }

    }

    //////////////////////////////////
    ///
    ///基本上比较好判断,不需要重构得出Composite模式,一般应用
    ///于树型结构或明显有容器结构的设计
    namespace Composite2
    {
     public interface IBox
     {
      void process();
      void Add(IBox box);
      void Remve(IBox box);
     }

     /// <summary>
     /// 叶子
     /// </summary>
     public class SingleBox:IBox
     {
      public void process()
      {
       throw UnsuporttedException();
      }
      void Add(IBox box)
      {
       throw UnsuporttedException();
      }
      void Remve(IBox box)
      {
      }
     }
     
     /// <summary>
     /// 树干
     /// </summary>
     public class ContainerBox:IBox
     {
      ArrayList list;
      public void Add(IBox box)
      {
       if(list==null)
       {
        list=new ArrayList();
       }
       list.Add(box);
      }
      public void Remove(IBox box)
      {
       if (list==null)
       {
        throw new Exception();
       }
       list.Remove(box);
      }
      public void process()//递归算法
      {
       //1.do process for myself
       //......

       //2.do process for the box in the list
       if(list!=null)
       {
        foreach(IBox box in list)
        {
         box.process();
        }
       }
      }
     }
     /// <summary>
     /// //////////////客户代码
     /// </summary>
     class App
     {
      public static void Main()
      {
       IBox box =Factory.GetBox();

       //客户对象与抽象接口进行耦合
       box.process();
      }
     }

    }

  • 相关阅读:
    poj3068
    tyvj1864 [Poetize I]守卫者的挑战
    BZOJ1597 [Usaco2008 Mar]土地购买
    [AtCoder Regular Contest 083] Bichrome Tree
    [LUOGU]3919 【模板】可持久化数组
    [LUOGU]P3701 主席树(假的)
    2018.7.20模拟赛
    [CodeForces]1006F Xor Path
    2018.7.19模拟赛
    [LUOGU]P1373 小a和uim之大逃离
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/347021.html
Copyright © 2011-2022 走看看