您申请加入课程:软件构造

软件构造

华南师范大学软件工程专业

https://www.scholat.com/course/rjgz
  • 创建者

    Creator

    潘家辉
  • 活跃度

    Activeness

  • 访问量

    Visits

    79373

教学公告

21软工第6周安排
[作者: 潘家辉  发布时间:2024-04-01 20:14:33  浏览次数:193次]

一、教学安排

讲授第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.htm


相关课程

扫一扫二维码,快速加入本课程!

放大二维码 查看使用方法
关闭