设计模式之--组合模式

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


角色:

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

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

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

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

使用场景:

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

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

与其它模式的区别:

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

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

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

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

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值