Composite 组合模式(结构型模式)

对象容器的问题
在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器。

public interface IBox
{void Process();
}public class SingleBox:IBox
{public void Process(){...}
}public class ContainerBox:IBox
{public void Process(){...}public ArrayList getBoxes(){...}
}

如果我们要对这样的对象进行处理:

class App
{public static void Main(){IBox box=Factory.GetBox();if(box is ContainerBox){box.Process();ArrayList list=((ContainerBox)box).GetBoxes();...//将面临比较复杂的递归处理
        }else if(box is SingleBox){box.Process();}}
}

动机(Motivation)
上述问题的根源在于:客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。
如何将“客户代码与复杂对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

意图(Intent)
将对象组合成属性结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。——《设计模式》GoF

可以将上面代码改为:

    public interface IBox{void Process();}public class SingleBox : IBox{public void Process(){}}public class ContainerBox : IBox{public void Process(){//1.Do process for myself//2.Do process for the box in this listif (Boxes != null){foreach (IBox box in Boxes){box.Process();}}}public IList Boxes{get;set;}}

    class App{public static void Main(){IBox box =new ContainerBox();box.Process();}}

Composite模式的几个要点
Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。
将“客户代码与复杂度对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复杂内部实现结构——发生依赖关系,从而更能“应对变化”。
Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的”IBox类中,还是将其定义在“表示对象容器的ContainerBox类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。
Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。

转载于:https://www.cnblogs.com/jesselzj/p/4722544.html

设计模式08: Composite 组合模式(结构型模式)相关推荐

  1. 23种设计模式:(二)结构型模式

    根据北京尚学堂的视频所学习 结构型模式: 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式. ...

  2. .NET设计模式(15):结构型模式专题总结

    .NET设计模式(15):结构型模式专题总结 --探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模 ...

  3. 设计模式初识(三)结构型模式(Structural Pattern)

    为什么要使用结构型模式 结构型模式关注点在于"如何组合对象/类",更关注类之间的组合关系: 类结构型模式关心类的组合,由多个类可以组合成一个更大的(继承): 对象结构型模式关心类与 ...

  4. 享元模式 - 结构型模式

    模式类型:     Flyweight   享元模式 - 结构型模式 意图:     The intent of this pattern is to use sharing to support a ...

  5. 详解23种设计模式(基于Java)—— 结构型模式(三 / 五)

    目录 3.结构型模式(7种) 3.1.代理模式 3.1.1.概述 3.1.2.结构 3.1.3.静态代理 3.1.4.JDK动态代理 3.1.5.CGLIB动态代理 3.1.6.三种代理的对比 3.1 ...

  6. 23种设计模式(第三章结构型模式7种)

    结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...

  7. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  8. Java设计模式之适配器模式(属于结构型模式)

    Java设计模式之适配器模式(结构型模式) 定义:将一个类的接口转换成客户希望的另外一个接口.Adaptor模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 模式中的角色: 目标接口(T ...

  9. 代理模式——结构型模式(7)

    前言 今天我们将介绍的最后一种结构型模式--代理模式,在介绍它之前,让我们先回顾下上一篇博文对享元模式的学习.享元模式主要是通过运用共享技术有效支持大量细粒度的对象,其本质在于两方面:分离和共享.简单 ...

  10. 设计模式深入学习---Component组合模式(结构型模式)

    Component组合模式是一个非常好用而且经常可以在大型项目中看到的设计模式.    首先我们来简单过一下什么是Component组合模式以及用该模式的情况和好处.Component组合模式就是将对 ...

最新文章

  1. 有java基础的人学python_准备自学Python ,会java,有什么建议吗?
  2. C标准中一些预定义的宏,如__FILE__,__func__等
  3. java垃圾回收到老年代次数,Java垃圾回收之回收算法
  4. 把输入字符的小写转换成大写并输出
  5. string 类的扩展方法
  6. ASP.Net学习笔记009--ASP.Net上次课程内容补充
  7. Soul 网关源码阅读(三)请求处理概览
  8. java openresty 调用_Openresty使用zlib解压缩response body
  9. sql server存储过程解密
  10. Python简单的小实验输出对应车站的中文简写(主要是为了解决汉字编码问题)
  11. 微信小程序云开发教程-产品原型的意义
  12. Linux安装及使用
  13. java rt.jar的源代码的位置
  14. IEC 61850通信协议体系介绍和分析
  15. 计算机网络 | 实验二 WINPCWP编程
  16. tl-wdr7300虚拟服务器怎么设置,TP-Link TL-WDR7300路由器wifi密码怎么设置?(电脑)...
  17. ev4转换MP4格式教程
  18. u盘装服务器系统失败原因,u盘装系统引导失败原因及解决方案
  19. 【数据结构系列】单链表
  20. dos 命令——切换盘符与切换工作目录

热门文章

  1. 类的继承私有成员问题
  2. Js取float型小数点后两位数的方法
  3. IOS中UIViewController的创建
  4. 不学无数——SpringBoot入门Ⅷ
  5. vc2008中mfc菜单、控件等汉字显示为问号或乱码的解决方法
  6. 《应用时间序列分析:R软件陪同》——导读
  7. 【HDOJ1043】八数码的八境界
  8. zabbix监控ntpd服务
  9. MONGODB 集群 配置及 客户端PHP 连接
  10. RUBY ON RAILS 插件收录: CACHE:Sweeper Generator