|
|
教学公告
一、教学安排
讲授第12章的内容184-197页
讲授第13章的内容 198-216页
完成实验3
二、重点难点
1、掌握组合模式和装饰的使用
2、掌握中如何实现聚合关联关系和组合模式
3、对比透明组合模式以及安全组合模式
4、对比透明装饰模式以及半透明装饰模式
大家可以根据自己的情况进行相应的预习
三、课前思考
小明所在的软件公司欲开发一个杀毒软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。现需要提供该杀毒软件的整体框架设计方案。
他们的初步方案是多层继承结构,如下图:
通过对初步方案进行分析,发现了下列问题:
(1) 文件夹类Folder的设计和实现都非常复杂,需要定义多个集合存储不同类型的成员,而且需要针对不同的成员提供增加、删除和获取等管理和访问成员的方法,存在大量的冗余代码;
(2) 由于系统没有提供抽象层,客户端代码必须有区别地对待充当容器的文件夹Folder和充当叶子的ImageFile和TextFile,无法统一对它们进行处理;
(3) 系统的灵活性和可扩展性差,如果需要增加新的类型的叶子和容器都需要对原有代码进行修改。
思考1:有没有更好的设计方案?
思考2:在组合模式结构图中,如果聚合关联关系不是从Composite到Component的,而是从Composite到Leaf的,会产生怎样的结果?
四、师说
树形结构不论在生活中或者是开发中都是一种非常常见的结构,一个容器对象(如文件夹)下可以存放多种不同的叶子对象或者容器对象,容器对象与叶子对象之间属性差别可能非常大。组合模式为解决此类问题而诞生,它可以让叶子对象和容器对象的使用具有一致性。而组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。比如:Swing中,Button、Checkbox等组件都是树叶,而Container容器是树枝;比如:文本编辑时,可以单个字编辑,也可以整段编辑,还可以全文编辑;文件复制时,可以一个一个文件复制,也可以整个文件夹复制等等情况。
下面我们以公司的层级结构为例,(选自《大话设计模式》)。
这幅图表示的是部分与整体的关系,因此我们就可以考虑使用组合模式。另外,细细分析图中的结构与组成,我们可以得出以下UML图:
组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。
五、阅读材料
简说组合模式(Composite Pattern )
https://my.oschina.net/u/141726/blog/407648
三分钟带您搞懂装饰模式
https://www.cnblogs.com/nedulee/p/12105111.html