美文网首页
浅谈GoF23设计模式-“Composite”模式

浅谈GoF23设计模式-“Composite”模式

作者: 浅谈码生活 | 来源:发表于2020-08-20 16:42 被阅读0次

    在讨论“Composite”模式之前先看一段代码:

    //描述箱子内部其他箱子
    //单个箱子
    public class SingleBox : IBox
    {
         public void Process() { }
    }  
    //箱子里面还有箱子
     public class ContainerBox : IBox
    {
          public void Process() { }
          ArrayList GetBox(){}
    }
    //在客户程序中同一条用Process()方法
    public static void Main(string[] args)
    {
           IBox box = Factory.GetBox();
           if(box  is  ContainerBox )
           { 
                 //...遍历里面所有箱子 
           }
            else if(box is SingleBox)
           {
                 box.Process();
           }
    }
    

    通过上述的代码可以发现,客户代码过多地依赖对象容器复杂的内部实现结构,对象容器内部实现结构的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端,而为了更好的解决这一问题我们将引入“Composite”模式。

    1.“Composite”模式定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。

    Composite.png

    2.“Composite”模式要点:

    1.)Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致的处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器;
    2.)将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将于纯碎的抽象接口,而非对象容器的复杂内部实现发生依赖关系,从而更能“应对变化”;
    3.)Composite模式中,是将“Add”和“Remove”等和对象容器相关的方法定义在“表示抽象对象的Composite类中”,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题;
    4.)Composite模式在具体的实现中,可以让父对象中的字对象反向追溯,如果父对象有频繁遍历需求,可以使用缓存技巧来改善效率;

    当我们引入“Composite”模式后来解决我们上面的问题:

     public interface IBox
        {
            void Process();
    
            void Add(IBox box);
    
            void Remove(IBox box);
        }
    
        public class SingleBox : IBox
        {
            public void Process()
            {
               //...
            }
            public void Add(IBox box)
            {
                throw new NotImplementedException();
            } 
    
            public void Remove(IBox box)
            {
                throw new NotImplementedException();
            }
        }
    
        public class ContainerBox : IBox
        {
            ArrayList list = null;
    
            public ContainerBox()
            {
                list = new ArrayList();
            }
            public  void Process()
            {
                if (list != null)
                {
                    foreach (IBox item in list)
                    {
                        item.Process();
                    }
                }
            }
    
            public  void Add(IBox box)
            {
                list.Add(box);
            }
    
            public void Remove(IBox box)
            {
                list.Remove(box);
            }
        }
    
        public class App
        {
            public static void Main()
            {
                IBox box = Factory.GetBox(); 
                //客户代码和接口进行耦合
                box.Process();
            }
        }
    

    相关文章

      网友评论

          本文标题:浅谈GoF23设计模式-“Composite”模式

          本文链接:https://www.haomeiwen.com/subject/scgsjktx.html