Java设计模式-内功修炼-结构型-组合模式

组合模式

定义

组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。

实例分析

现在要开发一款杀毒软件,要求能对多种文件类型进行杀毒,也能对文件夹进行杀毒。我们知道文件夹类似于一种树形结构,文件夹中可以包含文件夹和文件,那么如何才能实现上述功能呢?

实现方案1

  • 首先考虑对各种文件的杀毒,我们可以定义多个类,比如ImageFile, TextFile其中每个类中实现了杀毒函数。
  • 然后考虑实现对文件夹的杀毒:我们定义一个Folder,其中包含几个链表如:ImageList, TextList,FolderList,即将Image,Text,Folder类型的文件统计到List里面,杀毒的时候做循环遍历。
  • 实现完毕

上面是一种很容易想到的解决方案,也是笔者在学习组合模式之前的解决方案,我们来分析下上述方案的缺点:

  • 对文件夹的操作较为复杂。
  • 如果要增加一种新的文件类型呢?既要实现新类,又要修改FolderFile源码,显然不符合开闭原则。

所以我们寻求新的解决方案,要想符合开闭原则,那么就不能将ImageFile, TextFile,Folder区别对待,要将他们统一化。

其实到这里比较容易想到,做一个抽象层,针对抽象编程就能将他们统一起来。

实现方案2

先看组合模式的结构图:
在这里插入图片描述
从上图看出,组合模式的确是提供了一个抽象层,而且Composite和Component具有组合关系。

我们看下使用组合模式后。杀毒软件的解决方案:在这里插入图片描述
是不是明白了,在Folder里不再有各个文件的列表,而是抽象类的列表,对抽象编程。

总结

优点:

  • 清楚的定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次进行控制
  • 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是组合结构,简化了客户端代码
  • 组合模式中增加新的容器构建和叶子构建都很简单,无需修改原有代码,符合开闭原则
  • 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子和容器的递归组合,可以形成复杂的树形结构,并且可以实现简单的控制。

缺点

  • 由于抽象层中包含了容器类所有的方法,所以在叶子结点和容器结点之间形成了不一致性,这种不一致性需要手动消除,增加了复杂度。

适用场景

  • 具有整体和部分的结构中,希望通过一种方式忽略整体和部分的差异,客户端可以一致地对待他们。
  • 在面向对象语言开发时处理一个树形结构。
  • 一个系统中能够分离出叶子对象和容器对象,而且他们的类型不固定,需要增加一些新的类型。

本系列博客地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值