设计模式之--组合模式

系统 1563 0

有时候我们需要维护一些对象,这些对象具有一定的层次结构,它们之间虽然差异很大,但在使用的时候我们希望能构一致的对待,比如Windows控件,绘图中的图形等,这个时候我们就可以采用组合模式来进行管理。组合模式就是将要管理的对象按树型结构来进行组织,表示成一种“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式的结构图如下:


设计模式之--组合模式 角色:

组件接口:提供一致的访问接口,注意组件接口可以是抽象类,也可以是具体类,还可以用接口实现;

组合对象:含有孩子对象的对象;

叶子对象:不含孩子对象的对象。

组合对象自己维护一个子对象池,并按照组件接口的要求提供一致的访问方式,组合对象充当容器类职责,而叶子对象则不需要维护 子对象池,但也必须按组件接口要求实现统一的访问处理方式。

使用场景:

A)你想表示对象的“部分-整体”层次结构;

B)你希望用户忽略单个对象合组合对象的不同,用户将统一的使用组合结构中的所有对象;
典型的应用包括Delphi中的Component,C#中的控件Control,画图中的图形表示,业务中的组织结构表示,物料BOM,系统的功能结构,HTML的DOM模型等等。

与其它模式的区别:

从结构图上来看组合模式和装饰模式很相近,相同之处是两种模式都提供了一种组合,装饰模式提供的是一种功能的组合,而组合模式提供的是一种对象组合。不同之处在于装饰模式只维护一个构件的引用,而组合模式中的组合对象提维护的是一个组件池,数量上有区别,这个区别就决定了装饰模式并不能构成树型结构,而组合模式则可以。 从业务逻辑上来讲,装饰模式的使用是为了给构件增加新的行为特征,而组合模式是为了整体-局部的层次型管理。从应用上来讲,组合模式的应用比装饰模式更具一般化,因此使用更广。

另外装饰模式中装饰者和构件并不一定要求同一类对象,在使用上也有区别,而组合模式中的组合对象和叶子对象都是同一类对象,在使用上并无区别。

组合模式的设计方法不仅在程序设计上应用非常广,在业务设计上,数据结构设计上都应用非常广泛。

在使用组合模式时,为了提供更灵活的访问,在接口组件提供对父节点的访问接口,叶子对象和组合对象都会实现这种接口,比如Delphi中Wincontrol类中的Parent属性,C#中Control类中的Parent等。还可以提供对象检索之类的功能。

在具体实现组合模式时,有时候根据需要,组合对象的子对象池只保持一个对子对象的引用,所有的对象会用一个集合来进行管理,这样做的好处主要是为了方便对对象的检索和管理。比如索引对象,释放资源。树型访问有的时候会比较慢。典型应用就是Delphi中的Form类。所有在Form中创建并指定了Owner属性的控件,都在Form的Components列表中。

设计模式之--组合模式


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论