• 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();
      }
     }

    }

  • 相关阅读:
    分布式的并行计算技术
    深入学习 jQuery 选择器系列第三篇——过滤选择器之索引选择器
    JavaScript--我所理解的原型链
    JavaScript--我所理解的闭包
    JavaScript--函数的形参和函数内部声明的变量或函数重名时的问题
    JavaScript--substring 和 substr 方法手记
    CSS 和 CSS3 中的 background
    CSS3的 border-radius 和 box-shadow 及 text-shadow
    CSS3-渐变这个属性
    CSS中的伪类和伪元素回顾
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/347021.html
Copyright © 2020-2023  润新知