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

    }

  • 相关阅读:
    【更新】Java发送邮件:个人邮箱(QQ & 网易163)+企业邮箱+Android
    git pull 出现 WARNING: POSSIBLE DNS SPOOFING DETECTED!
    Redis解决“重试次数”场景的实现思路
    IDEA更改JavaScript版本
    npm与yarn命令
    SpringBoot+Vue前后端分离项目,maven package自动打包整合
    Vue(九)使用Ant Design入门——环境搭建
    Git常用命令
    Vue(八)全局变量和全局方法
    笔记本电池怎样使用问题
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/347021.html
Copyright © 2011-2022 走看看