电工与电子技术电子商务电子课件软件设计模式课件-结构型模式ppt_第1页
电工与电子技术电子商务电子课件软件设计模式课件-结构型模式ppt_第2页
电工与电子技术电子商务电子课件软件设计模式课件-结构型模式ppt_第3页
电工与电子技术电子商务电子课件软件设计模式课件-结构型模式ppt_第4页
电工与电子技术电子商务电子课件软件设计模式课件-结构型模式ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子课件软件设计模式课件-结构型模式第4章 结构型模式 本章主要介绍以下结构型设计模式外观模式适配器模式桥接模式装饰模式第4章 结构型模式之外观模式 在本节中,我们将:解释Facade模式是什么,并结合具体问题分析; 给出外观模式应用的几种情形; 给出外观模式的关键特征;给出java的实现代码供同学们参考。4.1 外观模式4.1.1 概述3第4章 结构型模式之外观模式 外观模式(Facade)又称门面模式,是一种对象结构型设计模式。在设计模式一书中对Facade模式的意图叙述如下:为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。这段话的大致意

2、思是说:Facade模式定义了一个更高层的接口来简化子系统的使用,为子系统调用提供一个统一的入口。 例如:在淘宝网店或实体店购买手机。一般有以下3个步骤:第一是选择手机品牌,第二是选择手机型号,第三是下单购买。4.1.2外观模式应用需求4第4章 结构型模式之外观模式4.1.3 外观模式解决方案 当没有使用外观模式时,买家(一般称为客户)需要直接使用三个购买步骤。第4章 结构型模式之外观模式 不足之处: 子系统接口复杂,使用繁琐。 违反了迪米特法则(Lod)。(private 属性减少依赖) 解决方案 使用外观模式解决顾客的一站式服务。 通过外观模式的学习,针对有复杂子系统的设计,为了简化客户端

3、的使用和隔离子系统的变化,在设计时会对其进行一个外观模式的包装 (购物助手),这样就可以解决上述问题。第4章 结构型模式之外观模式 在上面的使用过程中,Client直接和子系统进行交互。当子系统发生变化时,大概率会影响到Client的调用。而且在子系统的不断优化、更新中,系统的复杂性会很大提升。这对Client来说非常不利。 所以要解决上面所遇到的问题,必须简化考虑子系统调用的过程。这其实就是外观模式的意图:希望简化原有系统的使用方式,需要定义自己的接口。第4章 结构型模式之外观模式 在上面的使用过程中,Client直接和子系统进行交互。当子系统发生变化时,大概率会影响到Client的调用。而

4、且在子系统的不断优化、更新中,系统的复杂性会很大提升。这对Client来说非常不利。 所以要解决上面所遇到的问题,必须简化考虑子系统调用的过程。这其实就是外观模式的意图:希望简化原有系统的使用方式,需要定义自己的接口。第4章 结构型模式之外观模式 使用外观模式后解决方案如下:第4章 结构型模式之外观模式 Facade模式:关键特征 意图:希望简化现有系统的使用方法。需要定义自己的接口。 问题:只需要使用一个复杂系统的一个子集。或者,需要用一种 特殊的方法 与系统交互。 解决方案:Facade向客户展现使用现有系统的一个新的接口。 参与者与协作者:向客户展现一个定制的接口,让客户更容易地 使用现

5、有系统。 效果: 简化了所需子系统的使用,但某些功能对子系统是不可用的。 实现:定义一个(或一组)新的类来提供所需的接口。4.1.4 学习Facade模式10第4章 结构型模式之外观模式 1) Facade不仅可以为方法的调用创建简单的接口,还可以减少客户必须处理的对象数量。 2) Facade模式的变体:一个封装层 Facade模式用于隐藏或包装原有的系统。 Facade可以把原有系统作为自己的私有成员。原有系统与Facade类联系在一起,但使用Facade的客户无法看到原有的系统。 4.1.5 备注:Facade模式11第4章 结构型模式之外观模式 需要包装原有系统的理由: 跟踪对系统的使

6、用强迫所有客户通过 Facade使 用原有系统,然后就可以很容易地监控对系统的使用了。 改变系统在未来需要的时候对系统进行改变。12第4章 结构型模式之外观模式 Facade模式适用场合: 不需要使用一个复杂系统的所有功能。 希望包装或隐藏原有系统。 希望使用原有系统的功能,并希望增加一些 新的功能。 编写一个新的类的代价“小于让所有人学会使 用原有系统”或“在未来维护整个系统”所需的 代价。4.1.6 Facade模式适用场合13第4章结构型模式之Adapter模式 在本节中,我们将:说明Adapter模式是什么,以及怎样应用;给出适配器模式的应用扩展;给出适配器模式的关键特征;给出java

7、代码来帮助同学们理解和学习。 4.2 适配器模式14第4章结构型模式之Adapter模式 按照四人团的说法,Adapter模式的意图是:将一个类的接口转换成用户希望的另一个接口,Adapter模式使原本由于接口不兼容而不能在一起工作的那些类可以一起工作。 这段话的主要意思是:我们需要一种方法,为一个内容合适但接口不匹配的对象创建一个新的接口。 4.2.1 适配器模式应用需求15第4章结构型模式之Adapter模式 假设客户要开发一款画图软件,在项目开发初期约定开发三个画图模块:甘特图模块(Gantt)、数据流图模块(DataFlow)和网络图模块(Network)。在三个模块开发完成后,客户突

8、然要求加一个UML模块。因为人力成本和工期将近等各种原因,开发一个新的UML模块已然来不及。这时开发程序员小刘发现网上有已经实现的UML模块接口,但是和本项目的接口不兼容。 怎么办? 4.2.1 适配器模式应用需求16第4章结构型模式之Adapter模式4.2.3对象适配器模式解决方案 针对接口不兼容的问题,一般采用适配器模式来解决。适配器模式又分为对象适配器模式和类适配器模式。 适配器模式一般包含以下主要角色。 目标接口(Target):当前系统业务所期待的接口,它可以是抽象类或接口。 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。 适配器(Adapter)类:它是一

9、个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。17第4章结构型模式之Adapter模式 上面问题中,目标接口就是画图软件(Draw), 适配者类就是UML模块,适配器类可以理解为一个可以将UML模块与Draw兼容的转换器。18第4章结构型模式之Adapter模式19第4章结构型模式之Adapter模式类Adapter模式:Adapter类继承了UML类20第4章结构型模式之Adapter模式 适配器模式的优点: (1)解耦目标类和适配者类,通过引入适配器类复用适配者类,无需修改源代码。 (2)对客户端来说,封装了适配者类的实现细节,增加了类

10、的透明性和复用性。 (3)可以方便的更换适配器类,也可以不修改源代码增加新的适配器类,符合开闭原则。 21第4章结构型模式之Adapter模式4.2.4 适配器模式应用扩展 适配器模式(Adapter)可扩展为双向适配器模式,双向适配器类既可以用目标接口对象访问适配者,也可以用适配者对象访问目标接口。22第4章结构型模式之Adapter模式 意图:将一个无法控制的现有对象与一个特定接口相匹配。 问题:一个系统拥有正确的数据和行为,但接口却是错误的。 解决方案:Adapter 模式用我们需要的接口对无法修改的类进行包装。 参与者与协作者:Adapter 对Adaptee 的接口进行适配,使它与T

11、arget 相匹配。让Client把Adaptee当作Target的一个类型来使用。 效果: Adapter模式让现存的对象适应新的类结构,而不受它们的接 口限制。 实现:将现存的类包含在另一个类之中。包容类与需要的接口相匹 配,并调用被包容类的方法。4.2.5 Adapter 模式:关键特征 23第4章结构型模式之Adapter模式Adapter与Facade模式的比较: 包装器和对象包装器都是经常使用的术语。一种常见的思考是使用对象对遗留工程进行包装,使它们更容易使用。Adapter与Facade模式的比较Facade模式Adapter模式是否有现存的类是是是否必须对某个接口进行设计否是一

12、个对象是否需要多态行为否可能是否需要一个更简单的接口是否结论:Facade模式简化接口处理,而Adapter模式将接口转换成另一个接口。24第4章 结构型模式之Bridge模式4.3.1 概述 在本节中,我们将:说明Bridge模式是什么,以及怎样应用;给出桥接模式的更多讨论;给出桥接模式的关键特征;给出java代码来帮助同学们理解和学习;25第4章 结构型模式之Bridge模式4.3.2桥接模式应用需求 根据 四人团的说话,Bridge模式的意图是将抽象部分与抽象方法的实现相分离,使它们可以独立地变化。分离是让各部分的行为各自独立,或至少显式指出关联。抽象部分是指不同的事物在概念层次上的联系

13、。很明显,我的迷惑主要来自我对“抽象方法的实现”这个词的误解;这里实现指的是抽象类及其派生类用来实现自己的对象。(而不仅是抽象类的派生类) Bridge模式是最难理解的模式之一,这部分是因为它的威力如此强大、适应的范围如此广泛。 26第4章 结构型模式之Bridge模式 为笔记本电脑生产商建立一个笔记本电脑管理模型,要求对各个品牌的笔记本电脑进行管理。 为了简化模型以及更好理解问题,先假设有两种品牌的笔记本电脑:联想(Lenovo)以及戴尔(Dell),并且这两个品牌的笔记本电脑有广达(Quanta)和仁宝(Compal)这两个代工厂来生产。27第4章 结构型模式之Bridge模式4.3.3

14、桥接模式解决方案 (1) 通过继承方法 通过引入一个抽象类Lenovo,从上图可以看出,不同的Lenovo对象之间的差异是如何实现ProduceLenovo方法。通过实例化正确的Lenovo,即可实现不同的ProduceLenovo方法。28第4章 结构型模式之Bridge模式 现在还需要生产Dell笔记本电脑,要求客户对象无需知道Lenovo和Dell的差异。我们加入一个叫做Brand的新类,并从中派生Lenovo类和Dell类。这样Client对象可以只引用Brand对象,而不必考虑是哪种Brand类。29第4章 结构型模式之Bridge模式 在上述例子中,如果说变化点是问题领域中的特定具

15、体情况,共同点就定义了问题领域中将具体情况捆绑在一起的概念。共同的概念将由抽象类来表现,而变化点分析发现的变化点将由具体类来实现。 处理变化的策略是: 1)发现并封装变化点; 2)优先使用对象聚合,而不是类继承。 30第4章 结构型模式之Bridge模式 (2)通过桥接模式解决问题 通过对问题的分析要找到什么在发生变化,在这个问题中变化的是笔记本电脑品牌的种类和工厂的种类。而共同的概念是“品牌”和“工厂”,这就是上面所说的两个独立变化的维度。31第4章 结构型模式之Bridge模式 之后需要表示具体的变化。Brand类有联想(Lenovo)以及戴尔(Dell),Factory分别有广达(Qua

16、nta)和仁宝(Compal),如图4-15所示。 Brand和Factory的具体变化32第4章 结构型模式之Bridge模式 之后需要表示具体的变化。Brand类有联想(Lenovo)以及戴尔(Dell),Factory分别有广达(Quanta)和仁宝(Compal),如图4-15所示。 Brand和Factory的具体变化33第4章 结构型模式之Bridge模式如果Brand类使用Factory类来生产品牌笔记本电脑,Brand对象无需知道所用Factory对象的类型,因为可以让Brand引用Factory类。 Brand使用Factory34第4章 结构型模式之Bridge模式加入Fa

17、ctory对象的桥接模式结构图35第4章 结构型模式之Bridge模式 一条规则,一个地方的原则:一条规则只在一个地方实现。从方法的角度,这看起来与基于继承的实现相似,其最大区别在于:现在的实现被放置在不同的对象中。 Bridge模式让我发现,把实现部分看成“对象外部的,被对象使用的某种东西。通过对调用程序隐藏实现部分的变化点。用这种方式设计对象。36第4章 结构型模式之Bridge模式4.3.4 桥接模式的更多讨论使用继承设计的2个品牌和3个工厂(另一个工厂为纬创(Wistron)37第4章 结构型模式之Bridge模式使用桥接模式设计的2个品牌和3个工厂思考? 在本例子中,品牌和工厂抽象类

18、的聚合关系可以交换吗?38第4章 结构型模式之Bridge模式4.3.5 Bridge 模式关键特征 在使用Bridge模式时,经常看见Adapter模式被结合在Bridge模式中,但Adapter模式并不是Bridge模式的一部分。 Bridge模式关键特征 意图:将一组实现部分从另一组使用它们的对象中分离出来。 问题:一个抽象类的派生类必须使用多种实现部分,但又不能引起类数量的爆炸。 解决方案:为所有的实现部分定义一个接口,让抽象类的派生类使用这个接口。 39第4章 结构型模式之Bridge模式 参与者与协作者:Abstraction为正在实现的对象定义接口,Implementor为特定的

19、实现部分定义接口。 效果:实现部分与实现它的对象的分离。 实现: 将实现部分封装在一个抽象类中; 在被实现的抽象部分基类中包含一个实现部分基类的句柄。 另一件需要注意的是:表示抽象部分的对象(Shape对象)在实例化时获得它们的实现部分,这不是Bridege模式中固有的部分,但这种情况非常普遍。 40第4章 结构型模式之Bridge模式 即使我使用Bridge模式开发出的解决方案远远优于原来的解决方案,这也不够完美。衡量一个设计质量的一种方法就是:看它处理变化有多好。当使用Bridge模式时,处理一个新的实现部分是很容易的。 结论:模式并不是总能提供完美的解决方案。但是,因为模式体现的是许多设

20、计者许多年集合而成的经验,所以它们通常比我们自己能提出的解决方案更好。41第4章 结构型模式之Bridge模式 在学习Bridge模式的过程中,应该遵循下列处理变化的基本策略:发现并封装变化点; 优先使用对象组合而不是类继承。 42第4章 结构型模式之Decorator模式 在本章中,我们将:说明Decorator模式是什么,以及怎样应用;给出装饰模式的动态增加对象功能;给出装饰模式的关键特征。4.4 概述第4章 结构型模式之Decorator模式 在设计模式一书中对Decorator模式的意图描述如下:动态地给一个对象添加一些额外地职责。就增加功能来说,Decorator模式比生成子类更为灵

21、活。这句话的大致意思为:当为对象添加一些新功能时,使用Decorator模式比使用继承更加灵活。 例如:客户要开发一款画图软件(Software),甘特图(Gantt)模块作为Software的一个子模块现在已经开发完成。客户临时增加需求:要为Gantt模块增加颜色功能。为了简化问题,我们假定先增加两种颜色:红色(Red)和黑色(Black)。 4.4.1 装饰模式应用需求第4章 结构型模式之Decorator模式 4.4.2 装饰模式的解决方案 (1)通过继承方法 通过继承解决问题,具体来讲就是直接在Gantt派生Red和Black类,因为Gantt派生自画图软件(Software),因此得

22、到以下类图。第4章 结构型模式之Decorator模式 (2)通过装饰模式解决问题 按照四人团的说法, Decorators模式:动态地给一个对象添加一些额外的职责。就增加功能来说, Decorators模式相比生成子类更为灵活。 Decorators模式的作用效果是:创建以Decorators对象负责新的功能的对象开始的一条对象链,并结束于最初的对象。Decrator1Decrator2Decrator3ConcreteCompDecrator 链第4章 结构型模式之Decorator模式Decorator类图第4章 结构型模式之Decorator模式 根据上面的问题分析得出,Gantt模块

23、是画图软件(Software)的派生,即Gantt类为Software的子类,如图4-24所示。Software派生Gantt第4章 结构型模式之Decorator模式 新建一个Decorator抽象类,其派生Red和Black类为Gantt类分别添加红色(Red)和黑色(Black)功能,如下图所示。图 抽象装饰类派生具体装饰 第4章 结构型模式之Decorator模式 Decorator(抽象装饰类)的主要功能是为Gantt (具体类)添加功能,所以Decorator和Gantt都派生自Software抽象类。在装饰模式中通过使用组合/聚合关系将Decorator和Gantt联系起来,因为

24、需求是Decorator要为Gantt增加功能,所以在Decorator中增加Software对象(所学设计模式中唯一特例:即聚合又继承的关系)。具体实现类下图所示。第4章 结构型模式之Decorator模式采用装饰模式的解决方案第4章 结构型模式之Decorator模式 我们可以从装饰模式的角色入手来说明装饰模式动态增加对象功能。装饰模式主要包含以下角色。 抽象类(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体类(ConcreteComponent)角色:实现抽象类,通过抽象装饰角色为其添加一些职责。 抽象装饰(Decorator)角色:继承抽象类,并包含具体类的实例,可以通过其子类扩展具体类的功能。 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体类对象添加附加的责任4.4.4 应用装饰模式动态增加对象功能第4章 结构型模式之Dec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论