版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 结构型设计模式主讲教师主讲教师:肖如良肖如良11:042本章教学内容w 结构型模式引言 结构型模式概述结构型模式概述 结构型模式简介结构型模式简介w 适配器模式w 桥接模式w 外观模式w 享元模式w 装饰模式w 代理模式w 组合模式11:043结构型模式引言w 结构型模式概述 结构型模式结构型模式(Structural Pattern)描述描述如何将类或者对如何将类或者对象结合在一起形成更大的结构象结合在一起形成更大的结构,就像搭积木,可以通过,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。简单积木的组合形成复杂的、功能更为强大的结构。 11:044结构型模式w 结
2、构型模式概述结构型模式可以分为结构型模式可以分为类结构型模式类结构型模式和和对象结构型模式对象结构型模式: 类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。 对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。11:045结构型模式w 结构型模式简介 适配器模式适配器模式(Adapter) 桥接模式桥接模式(Bridge) 组合模式组合模式(Composite) 装饰模式装饰模式
3、(Decorator)外观模式外观模式(Facade) 享元模式享元模式(Flyweight) 代理模式代理模式(Proxy) 11:046适配器模式w模式动机11:047适配器模式w 模式动机 在软件开发中采用类似于电源适配器的设计和编码技巧被称为在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配适配器模式器模式。 通常情况下,通常情况下,客户端可以通过目标类的接口访问它所提供的服务客户端可以通过目标类的接口访问它所提供的服务。有时,现有的类可以满足客户类的功能需要,但是它所提供的接口有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类
4、中方法名与目标类不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。中定义的方法名不一致等原因所导致的。 在这种情况下,现有的接口需要转化为客户类期望的接口,这样保在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。现有类所提供的功能,适配器模式可以完成这样的转化。 11:048适配器模式w 模式动机 在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这在适配器模式中可以定义一
5、个包装类,包装不兼容接口的对象,这个包装类指的就是个包装类指的就是适配器适配器(Adapter),它所包装的对象就是,它所包装的对象就是适配者适配者(Adaptee),即被适配的类。,即被适配的类。 适配器提供客户类需要的接口,适配器提供客户类需要的接口,适配器的实现就是把客户类的请求适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用转化为对适配者的相应接口的调用。也就是说:。也就是说:当客户类调用适配当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。程对
6、客户类是透明的,客户类并不直接访问适配者类。因此,因此,适配适配器可以使由于接口不兼容而不能交互的类可以一起工作器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适。这就是适配器模式的模式动机。配器模式的模式动机。11:049适配器模式w 模式定义适配器模式适配器模式(Adapter Pattern) :将一个接口转换成客将一个接口转换成客户希望的另一个接口户希望的另一个接口,适配器模式,适配器模式使接口不兼容的那些使接口不兼容的那些类可以一起工作类可以一起工作,其别名为,其别名为包装器包装器(Wrapper)。适配器。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式既可以作为
7、类结构型模式,也可以作为对象结构型模式。模式。11:0410适配器模式w 模式定义Adapter Pattern: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldnt otherwise because of incompatible interfaces. Frequency of use: medium high 11:0411适配器模式w 模式结构类适配器类适配器Adapter+ request ().
8、Target+ request ().Adaptee+ specificRequest ().ClientspecificRequest();11:0412适配器模式w 模式结构对象适配器对象适配器adapteeAdapter+ request ().Adaptee+ specificRequest ().Clientadaptee.specificRequest();Target+ request ().11:0413适配器模式w 模式结构适配器模式包含如下角色:适配器模式包含如下角色: Target:目标抽象类 Adapter:适配器类 Adaptee:适配者类 Client:客户类11:
9、0414适配器模式w 模式分析典型的类适配器代码:典型的类适配器代码:public class Adapter extends Adaptee implements Targetpublic void request()specificRequest();11:0415适配器模式w 模式分析典型的对象适配器代码:典型的对象适配器代码:public class Adapter extends Targetprivate Adaptee adaptee;public Adapter(Adaptee adaptee)this.adaptee=adaptee;public void request()
10、adaptee.specificRequest(); 11:0416适配器模式w 适配器模式实例与解析实例一:仿生机器人实例一:仿生机器人 现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,使用适配器模式进行系统设计。11:0417适配器模式w 适配器模式实例与解析实例一:仿生机器人实例一:仿生机器人 DogAdapter+cry ()move ().: void: voidRobot+cry ()move ().: void: voidDog+
11、wang ()run ().: void: void11:0418适配器模式w 适配器模式实例与解析实例一:仿生机器人实例一:仿生机器人 参考代码演示演示11:0419适配器模式w 适配器模式实例与解析实例二:加密适配器实例二:加密适配器 某系统需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。11:0420适配器模式w 适配器模式实例与解析实例二:加密适配器实
12、例二:加密适配器ciphercipherDataOperatorabstract - password : String+setPassword (String password)getPassword ()doEncrypt (int key, String ps).: void: String: StringCipherAdapter- cipher : Caesar+CipherAdapter ()doEncrypt (int key, String ps).: StringNewCipherAdapter- cipher : NewCipher+NewCipherAdapter ()d
13、oEncrypt (int key, String ps).: StringCaesar+ doEncrypt (int key, String ps).: StringNewCipher+ doEncrypt (int key, String ps).: String11:0421适配器模式w 适配器模式实例与解析实例二:加密适配器实例二:加密适配器 参考代码演示演示11:0422适配器模式w 模式优缺点适配器模式的优点适配器模式的优点 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类
14、来说是透明的,而且提高了适配者的复用性。 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。11:0423适配器模式w 模式优缺点类适配器模式还具有如下优点:类适配器模式还具有如下优点: 由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。类适配器模式的缺点如下:类适配器模式的缺点如下: 对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口
15、。11:0424适配器模式w 模式优缺点对象适配器模式还具有如下优点:对象适配器模式还具有如下优点: 一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。对象适配器模式的缺点如下:对象适配器模式的缺点如下: 与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。11:0425适配器模式w 模式适用环境在以下情况下可以使用适配器模式:在以下情况下可以使用适配器模式: 系统需
16、要使用现有的类,而这些类的接口不符合系统的需要。 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。11:0426适配器模式w 模式应用(1) Sun公司在公司在1996年公开了年公开了Java语言的数据库连接语言的数据库连接工具工具JDBC,JDBC使得使得Java语言程序能够与数据库连语言程序能够与数据库连接,并使用接,并使用SQL语言来查询和操作数据。语言来查询和操作数据。JDBC给出一给出一个客户端通用的抽象接口,每一个具体数据库引擎个客户端通用的抽象接口,每一个具体数据库引擎(如(如SQL Server、Oracle、MySQL
17、等)等)的的JDBC驱动软件驱动软件都是一个介于都是一个介于JDBC接口和数据库引擎接口之间的适配接口和数据库引擎接口之间的适配器软件。器软件。抽象的抽象的JDBC接口和各个数据库引擎接口和各个数据库引擎API之间之间都需要相应的适配器软件,这就是为各个不同数据库引都需要相应的适配器软件,这就是为各个不同数据库引擎准备的擎准备的驱动程序驱动程序。11:0427适配器模式w 模式应用(2)在在Spring AOP框架中,对框架中,对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型借助适三种通知类型借助适配器模式来实现。配器模式来实现。public inter
18、face AdvisorAdapter /将一个Advisor适配成MethodInterceptor MethodInterceptor getInterceptor(Advisor advisor); /判断此适配器是否支持特定的Advice boolean supportsAdvice(Advice advice); 11:0428适配器模式w 模式应用(3)在在JDK类库中也定义了一系列适配器类,如在类库中也定义了一系列适配器类,如在mon包中定义的包中定义的InputStreamAdapter类,用于包装类,用于包装ImageInputStream接接口及其子类对象。口及其子类对象。
19、public class InputStreamAdapter extends InputStream ImageInputStream stream; public InputStreamAdapter(ImageInputStream stream) super(); this.stream = stream; public int read() throws IOException return stream.read(); public int read(byte b, int off, int len) throws IOException return stream.read(b,
20、 off, len); 11:0429适配器模式w 模式扩展默认适配器模式默认适配器模式(Default Adapter Pattern)或缺省适或缺省适配器模式配器模式 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。 11:0430适配器模式w 模式扩展默认适配器模式默认适配器模式 适配者接口 默认适配器类 具体业务类 ServiceInterface+serviceMethod1 ()service
21、Method2 ()serviceMethod3 ().: void: void: voidAbstractServiceClassabstract +serviceMethod1 ()serviceMethod2 ()serviceMethod3 ().: void: void: voidConcreteServiceClass+serviceMethod1 ()serviceMethod2 ()serviceMethod3 ().: void: void: void11:0431适配器模式w 模式扩展默认适配器模式默认适配器模式WindowAdapterabstract +windowOp
22、ened (WindowEvent e)windowClosing (WindowEvent e)windowClosed (WindowEvent e)windowIconified (WindowEvent e)windowDeiconified (WindowEvent e)windowActivated (WindowEvent e)windowDeactivated4 (WindowEvent e)windowStateChanged (WindowEvent e)windowGainedFocus (WindowEvent e)windowLostFocus (WindowEven
23、t e): void: void: void: void: void: void: void: void: void: voidWindowListener+windowOpened (WindowEvent e)windowClosing (WindowEvent e)windowClosed (WindowEvent e)windowIconified (WindowEvent e)windowDeiconified (WindowEvent e)windowActivated (WindowEvent e)windowDeactivated (WindowEvent e).: void:
24、 void: void: void: void: void: void11:0432适配器模式w 模式扩展双向适配器双向适配器 在对象适配器的使用过程中,如果在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么该适配器就是一个双向适配器。11:0433适配器模式w 模式扩展双向适配器双向适配器 adapteetargetAdapter-adapteetarget: Adaptee: Target+request ()specificRequest ()setTarget (Target target)setAdaptee
25、(Adaptee adaptee).Target+ request ().adaptee.specificRequest();Adaptee+ specificRequest ().target.request();ConcreteTarget+ request ().ConcreteAdaptee+ specificRequest ().11:0434本节小结w 结构型模式描述如何将类或者对象结合在一起形成更大的结构。w 适配器模式用于将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
26、w 适配器模式包含四个角色:目标抽象类定义客户要用的特定领域的接口;适配器类可以调用另一个接口,作为一个转换器,对适配者和抽象目标类进行适配,它是适配器模式的核心;适配者类是被适配的角色,它定义了一个已经存在的接口,这个接口需要适配;在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法。w 在类适配器模式中,适配器类实现了目标抽象类接口并继承了适配者类,并在目标抽象类的实现方法中调用所继承的适配者类的方法;在对象适配器模式中,适配器类继承了目标抽象类并定义了一个适配者类的对象实例,在所继承的目标抽象类方法中调用适配者类的相应业务方法。 11:0435本节小结w 适配器模式的主要优
27、点是将目标类和适配者类解耦,增加了类的透明性和复用性,同时系统的灵活性和扩展性都非常好,更换适配器或者增加新的适配器都非常方便,符合“开闭原则”;类适配器模式的缺点是适配器类在很多编程语言中不能同时适配多个适配者类,对象适配器模式的缺点是很难置换适配者类的方法。w 适配器模式适用情况包括:系统需要使用现有的类,而这些类的接口不符合系统的需要;想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作。11:0436桥接模式肖如良肖如良11:0437本节教学内容w 桥接模式 模式动机与定义模式动机与定义 模式结构与分析模式结构与分析 模式实例与解析模式实例与解析 模式效果与应用
28、模式效果与应用 模式扩展模式扩展11:0438桥接模式w模式动机设想如果要绘制矩形、圆形、椭圆、正方形,我们至少设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要需要4个形状类,但是如果绘制的图形需要具有不同的个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:计方案: 第一种设计方案是为每一种形状都提供一套各种颜色的版本。 第二种设计方案是根据实际需要对形状和颜色进行组合。 11:0439桥接模式w模式动机1211:0440桥接模式w模式动机对于有对于有两个变化维度两个变化维度(即两个变化的原因)
29、的(即两个变化的原因)的系统,采用系统,采用方案二方案二来进行设计系统中类的个数来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式桥接模式的应用。桥接模式将继承关系转换为将继承关系转换为关联关系关联关系,从而,从而降低了类与类之间的耦合降低了类与类之间的耦合,减减少了代码编写量少了代码编写量。11:0441桥接模式w模式动机11:0442桥接模式w 模式定义桥接模式桥接模式(Bridge Pattern):将抽象部分与它的实现部将抽象部分与它的实现部分分离,使它们都可以独立地变化分分离,使它们都可以独立地变化。它是一
30、种对象结构。它是一种对象结构型模式,又称为柄体型模式,又称为柄体(Handle and Body)模式或接口模式或接口(Interface)模式。模式。11:0443桥接模式w 模式定义Bridge Pattern: Decouple an abstraction from its implementation so that the two can vary independently. Frequency of use: medium11:0444桥接模式w 模式结构implClientAbstraction+ operation ().Implementor+ operationImpl
31、 ().RefinedAbstraction+ operation ().ConcreteImplementorA+ operationImpl ().ConcreteImplementorB+ operationImpl ().11:0445桥接模式w 模式结构桥接模式包含如下角色:桥接模式包含如下角色: Abstraction:抽象类 RefinedAbstraction:扩充抽象类 Implementor:实现类接口 ConcreteImplementor:具体实现类 11:0446桥接模式w 模式分析 理解桥接模式,重点需要理解如何将理解桥接模式,重点需要理解如何将抽象化抽象化(Abs
32、traction)与与实现化实现化(Implementation)脱耦脱耦,使得二者可以独立地变化。,使得二者可以独立地变化。 抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。 实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使
33、用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。 11:0447桥接模式w 模式分析典型的实现类接口代码:典型的实现类接口代码:public interface Implementorpublic void operationImpl(); 11:0448桥接模式w 模式分析典型的抽象类代码:典型的抽象类代码:public abstract class Abstractionprotected Implementor impl;public void setImpl(Implementor impl)this.impl=impl;public
34、abstract void operation(); 11:0449桥接模式w 模式分析典型的扩充抽象类代码:典型的扩充抽象类代码:public class RefinedAbstraction extends Abstractionpublic void operation()/代码impl.operationImpl();/代码 11:0450桥接模式w 桥接模式实例与解析实例一:模拟毛笔实例一:模拟毛笔现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜
35、料盒,用3+5=8个类就可以实现15支蜡笔的功能。本实例使用桥接模式来模拟毛笔的使用过程。11:0451桥接模式w 桥接模式实例与解析实例一:模拟毛笔实例一:模拟毛笔colorPenabstract # color : Color+setColor (Color color)draw (String name).: void: voidColor+ bepaint (String penType, String name).: voidSmallPen+ draw (String name).: voidRed+ bepaint (String penType, String name).:
36、voidMiddlePen+ draw (String name).: voidBigPen+ draw (String name).: voidGreen+ bepaint (String penType, String name).: voidBlue+ bepaint (String penType, String name).: voidWhite+ bepaint (String penType, String name).: voidBlack+ bepaint (String penType, String name).: void11:0452桥接模式w 桥接模式实例与解析实例
37、一:模拟毛笔实例一:模拟毛笔 参考代码 演示演示11:0453桥接模式w 桥接模式实例与解析实例二:跨平台视频播放器实例二:跨平台视频播放器 如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、Unix等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。现使用桥接模式设计该播放器。11:0454桥接模式w 桥接模式实例与解析实例二:跨平台视频播放器实例二:跨平台视频播放器Abstract MethodvfOperatingSystemVersionabstract # vf : VideoFile+setVideoFile
38、(VideoFile vf)play (String fileName).: void: voidVideoFile+ decode (String osType, String fileName).: voidWindowsVersion+ play (String fileName).: voidMPEGFile+ decode (String osType, String fileName).: voidLinuxVersion+ play (String fileName).: voidUnixVersion+ play (String fileName).: voidRMVBFile
39、+ decode (String osType, String fileName).: voidWMVFile+ decode (String osType, String fileName).: voidAVIFile+ decode (String osType, String fileName).: void11:0455桥接模式w 模式优缺点桥接模式的优点桥接模式的优点 分离抽象接口及其实现部分。 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。 桥接
40、模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。 实现细节对客户透明,可以对用户隐藏实现细节。 11:0456桥接模式w 模式优缺点桥接模式的缺点桥接模式的缺点 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。 11:0457桥接模式w 模式适用环境 在以下情况下可以使用桥接模式:在以下情况下可以使用桥接模式: 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥
41、接模式可以使它们在抽象层建立一个关联关系。 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。11:0458桥接模式w 模式应用(1) Java语言通过语言通过Java虚拟机实现了平台的无关性。虚拟机实现了平台的
42、无关性。11:0459桥接模式w 模式应用 (2) 一个一个 Java桌面软件总是带有所在操作系统的视感桌面软件总是带有所在操作系统的视感(LookAndFeel),如果一个,如果一个Java软件是在软件是在Unix系统上开发的,系统上开发的,那么开发人员看到的是那么开发人员看到的是Motif用户界面的视感;在用户界面的视感;在Windows上面上面使用这个系统的用户看到的是使用这个系统的用户看到的是Windows用户界面的视感;而一用户界面的视感;而一个在个在Macintosh上面使用的用户看到的则是上面使用的用户看到的则是Macintosh用户界面用户界面的视感,的视感,Java语言是通过
43、所谓的语言是通过所谓的Peer架构做到这一点的。架构做到这一点的。Java为为AWT中的每一个中的每一个GUI构件都提供了一个构件都提供了一个Peer构件,构件,在在AWT中中的的Peer架构就使用了桥接模式架构就使用了桥接模式。 11:0460桥接模式w 模式应用(3) JDBC驱动程序也是桥接模式的应用之一。使用驱动程序也是桥接模式的应用之一。使用JDBC驱动程序的应用系统就是抽象角色,而所使用驱动程序的应用系统就是抽象角色,而所使用的数据库是实现角色。的数据库是实现角色。一个一个JDBC驱动程序可以动态驱动程序可以动态地将一个特定类型的数据库与一个地将一个特定类型的数据库与一个Java应
44、用程序绑应用程序绑定在一起,从而实现抽象角色与实现角色的动态耦合。定在一起,从而实现抽象角色与实现角色的动态耦合。11:0461桥接模式w 模式扩展适配器模式与桥接模式的联用适配器模式与桥接模式的联用 桥接模式和适配器模式用于设计的不同阶段,桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;而在初步设计完成之后,当发现系统与已有类无法协同工作时,可以采用适配器模式。但有时候在设计初期也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况。11:0462桥接模式w 模式扩展适配器模式与桥接模式的联用适配器模式与桥接模式的联
45、用11:0463本节小结w 桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。w 桥接模式包含如下四个角色:抽象类中定义了一个实现类接口类型的对象并可以维护该对象;扩充抽象类扩充由抽象类定义的接口,它实现了在抽象类中定义的抽象业务方法,在扩充抽象类中可以调用在实现类接口中定义的业务方法;实现类接口定义了实现类的接口,实现类接口仅提供基本操作,而抽象类定义的接口可能会做更多更复杂的操作;具体实现类实现了实现类接口并且具体实现它,在不同的具体实现类中提供基本操作的不同实现,在程序运
46、行时,具体实现类对象将替换其父类对象,提供给客户端具体的业务操作方法。w 在桥接模式中,抽象化(Abstraction)与实现化(Implementation)脱耦,它们可以沿着各自的维度独立变化。11:0464本节小结w 桥接模式的主要优点是分离抽象接口及其实现部分,是比多继承方案更好的解决方法,桥接模式还提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,实现细节对客户透明,可以对用户隐藏实现细节;其主要缺点是增加系统的理解与设计难度,且识别出系统中两个独立变化的维度并不是一件容易的事情。w 桥接模式适用情况包括:需要在构件的抽象化角色和具体化角色之间增加更多的灵
47、活性,避免在两个层次之间建立静态的继承联系;抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响;一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;设计要求需要独立管理抽象化角色和具体化角色;不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统。11:0465装饰模式肖如良肖如良11:0466本节教学内容w 装饰模式 模式动机与定义模式动机与定义 模式结构与分析模式结构与分析 模式实例与解析模式实例与解析 模式效果与应用模式效果与应用 模式扩展模式扩展11:0467装饰模式w模式动机11:0468装饰模式w模式动机 一般有两种方式可以实现给一个类或对象增加行为:一般有两种方
48、式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)。 11:0469装饰模式w模式动机装饰模式以装饰模式以对客户透明的方式动态地给一个对象附加上对客户透明的方式动态地给一个对象附加上更多的责任更多的责任,换言之,客户端并不会觉得对象在装饰前,换言之,客户端并不会觉得对象在装饰前
49、和装饰后有什么不同。装饰模式可以和装饰后有什么不同。装饰模式可以在不需要创造更多在不需要创造更多子类的情况下,将对象的功能加以扩展子类的情况下,将对象的功能加以扩展。这就是装饰模。这就是装饰模式的模式动机。式的模式动机。11:0470装饰模式w 模式定义装饰模式装饰模式(Decorator Pattern) :动态地给一个对象增动态地给一个对象增加一些额外的职责加一些额外的职责(Responsibility),就增加对象功能,就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可来说,装饰模式比生成子类实现更为灵活。其别名也可以称为以称为包装器包装器(Wrapper),与适配器模式的别
50、名相同,与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为也有人称之为“油漆工模式油漆工模式”,它是一种,它是一种对象结构型模对象结构型模式式。11:0471装饰模式w 模式定义Decorator Pattern: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. Freq
51、uency of use: medium11:0472装饰模式w 模式结构componentComponent+ operation ().ConcreteComponent+ operation ().Decorator+ operation ().component.operation();ConcreteDecoratorA- addedState : + operation ().ConcreteDecoratorB+operation ()addedBehavior ().super.operation();addedBehavior();11:0473装饰模式w 模式结构装饰模式包
52、含如下角色:装饰模式包含如下角色: Component: 抽象构件 ConcreteComponent: 具体构件 Decorator: 抽象装饰类 ConcreteDecorator: 具体装饰类11:0474装饰模式w 模式分析 与继承关系相比,关联关系的主要优势在于与继承关系相比,关联关系的主要优势在于不会破坏类的封装性不会破坏类的封装性,而且而且继承是一种耦合度较大的静态关系,无法在程序运行时动态继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由
53、于关联关系使系统具有较好的量,但是到了软件维护阶段,由于关联关系使系统具有较好的松松耦合性耦合性,因此使得,因此使得系统更加容易维护系统更加容易维护。当然,关联关系的缺点是。当然,关联关系的缺点是比继承关系要创建更多的对象比继承关系要创建更多的对象。 使用装饰模式来实现扩展比继承更加灵活,使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方它以对客户透明的方式动态地给一个对象附加更多的责任式动态地给一个对象附加更多的责任。装饰模式可以在不需要创。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。造更多子类的情况下,将对象的功能加以扩展。 11:0475装饰模式w 模式分析典型
54、的抽象装饰类代码:典型的抽象装饰类代码:public class Decorator extends Componentprivate Component component;public Decorator(Component component)ponent=component;public void operation()component.operation(); 11:0476装饰模式w 模式分析典型的具体装饰类代码:典型的具体装饰类代码:public class ConcreteDecorator extends Decoratorpublic ConcreteDecorator(
55、Component component)super(component);public void operation()super.operation();addedBehavior();public void addedBehavior() /新增方法 11:0477装饰模式w 装饰模式实例与解析实例一:变形金刚实例一:变形金刚 变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。11:0478装饰模式w 装饰模式实例与解析实例一:变形金刚实例一:变形金刚11:0479装饰模
56、式w 装饰模式实例与解析实例一:变形金刚实例一:变形金刚 参考代码演示演示11:0480装饰模式w 装饰模式实例与解析实例二:多重加密系统实例二:多重加密系统 某系统提供了一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密。用户先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密,当然也可以进行第三次加密。现使用装饰模式设计该多重加密系统。11:0481装饰模式w 装饰模式实例与解析实例二:多重加密系统实例二:多重加密系统cipherSimpleCiph
57、er+ encrypt (String plainText).: StringCipherDecorator- cipher : Cipher+CipherDecorator (Cipher cipher)encrypt (String plainText).: StringComplexCipher+ComplexCipher (Cipher cipher)encrypt (String plainText)reverse (String text).: String: StringAdvancedCipher+AdvancedCipher (Cipher cipher)encrypt (S
58、tring plainText)mod (String text).: String: StringCipher+ encrypt (String plainText).: String11:0482装饰模式w 装饰模式实例与解析实例二:多重加密系统实例二:多重加密系统 参考代码演示演示11:0483装饰模式w 模式优缺点 装饰模式的优点装饰模式的优点 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。 通过使用不同的具体装饰类以及这些装饰类的排列组合
59、,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。11:0484装饰模式w 模式优缺点装饰模式的缺点装饰模式的缺点 使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接的方式有所不同,而不是它们的类或者属性值有所不同,同时还将产生很多具体装饰类。这些装饰类和小对象的产生将增加系统的复杂度,加大学习与理解的难度。 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,
60、排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。11:0485装饰模式w 模式适用环境在以下情况下可以使用装饰模式:在以下情况下可以使用装饰模式: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类)。11:0486装饰模式w 模式应用 (1) 在在javax
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年执业医师考试-中西医结合执业医师历年参考题库含答案解析
- 2026年岗位知识竞赛-化工区岗位知识历年参考题库含答案解析
- 2026年山东住院医师-山东住院医师危重病科ICU历年参考题库含答案解析
- 2026年安全知识安全生产知识竞赛-机械操作安全知识竞赛历年参考题库含答案解析
- 2026年大学试题(财经商贸)-出口退税历年参考题库含答案解析
- 2026年大学试题(艺术学)-剧本写作历年参考题库含答案解析
- 2026年大学试题(管理类)-财务管理学历年参考题库含答案解析
- 2026年大学试题(法学)-公司法历年参考题库含答案解析
- 2026年大学试题(大学选修课)-探究万物之理历年参考题库含答案解析
- 2026年大学试题(哲学)-中国哲学史历年参考题库含答案解析
- 2026中国历史文化街区土地开发中的文保平衡策略
- 市政道路施工扬尘控制方案
- T∕CCEAS008-2026 建设工程造价咨询成果文件质量标准
- 医院检验科生物安全突发事件应急预案
- (正式版)DB34∕T 4541-2023 《废弃露天采坑一般工业固废处置与生态修复技术规范》
- 2026年湖北省检察官、法官入员额考试真题(附答案)
- 常见ABO疑难血型案例分析
- 【新教材】2026年秋季统编版九年级上册道德与法治第一单元 坚持党的全面领导 考点速记+练习题(含答案)
- 2026年新团员入团考试试题及答案
- 2026华能陇东电力筹建处校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 外贸企业进出口报关文件模板合集
评论
0/150
提交评论