适配器模式桥接模式ppt课件_第1页
适配器模式桥接模式ppt课件_第2页
适配器模式桥接模式ppt课件_第3页
适配器模式桥接模式ppt课件_第4页
适配器模式桥接模式ppt课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、w 构外型方式构外型方式w 构外型方式概述构外型方式概述w 构外型方式简介构外型方式简介w 适配器方式适配器方式w 方式动机与定义方式动机与定义w 方式构造与分析方式构造与分析w 方式实例与解析方式实例与解析w 方式效果与运用方式效果与运用w 方式扩展方式扩展w 桥接方式w 方式动机与定义w 方式构造与分析w 方式实例与解析w 方式效果与运用构外型方式w 构外型方式概述 w 构外型方式(Structural Pattern)描画如何将类或者对象结合在一同构成更大的构造,就像搭积木,可以经过简单积木的组合构成复杂的、功能更为强大的构造。 构外型方式w 构外型方式概述w 根据这一点,构外型方式可以

2、分为类构外型方式和对象构外型方式:w 类构外型方式关怀类的组合,由多个类可以组合成一个更大的系统,在类构外型方式中普通只存在承袭关系和实现关系。w 对象构外型方式关怀类与对象的组合,经过关联关系使得在一个类中定义另一个类的实例对象,然后经过该对象调用其方法。根据“合成复用原那么,在系统中尽量运用关联关系来替代承袭关系,因此大部分构外型方式都是对象构外型方式。构外型方式w 构外型方式简介 w 适配器方式(Adapter) w 桥接方式(Bridge) w 组合方式(Composite) w 装饰方式(Decorator)w 外观方式(Facade) w 享元方式(Flyweight) w 代理方

3、式(Proxy) 适配器方式w方式动机适配器方式w 方式动机w 在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器方式。 w 通常情况下,客户端可以经过目的类的接口访问它所提供的效能。有时,现有的类可以满足客户类的功能需求,但是它所提供的接口不一定是客户类所期望的,这可以是由于现有类中方法名与目的类中定义的方法名不一致等缘由所导致的。 w 在这种情况下,现有的接口需求转化为客户类期望的接口,这样保证了对现有类的重用。假设不进展这样的转化,客户类就不能利用现有类所提供的功能,适配器方式可以完成这样的转化。 适配器方式w 方式动机w 在适配器方式中可以定义一个包装类,包装不兼容接口的对象

4、,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。w 适配器提供客户类需求的接口,适配器的实现就是把客户类的恳求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一同义务。这就是适配器方式的方式动机。适配器方式w 方式定义w 适配器方式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器方式使接口不兼容的那些类可以一同义务,其别名为包装器(Wrapp

5、er)。适配器方式既可以作为类构外型方式,也可以作为对象构外型方式。适配器方式w 方式构造w 类适配器Adapter+ request ().Target+ request ().Adaptee+ specificRequest ().ClientspecificRequest();适配器方式w 方式构造w 对象适配器adapteeAdapter+ request ().Adaptee+ specificRequest ().Clientadaptee.specificRequest();Target+ request ().适配器方式w 方式构造w 适配器方式包含如下角色:w Target:

6、目的笼统类w Adapter:适配器类w Adaptee:适配者类w Client:客户类适配器方式w 方式分析w 典型的类适配器代码:public class Adapter extends Adaptee implements Targetpublic void request()specificRequest();适配器方式w 方式分析w 典型的对象适配器代码:public class Adapter extends Targetprivate Adaptee adaptee;public Adapter(Adaptee adaptee)this.adaptee=adaptee;publ

7、ic void request()adaptee.specificRequest(); 适配器方式w 适配器方式实例与解析w 实例一:仿活力器人 w 现需求设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人挪动方法move()等。假设希望在不修正已有代码的根底上使得机器人可以像狗一样叫,像狗一样跑,运用适配器方式进展系统设计。适配器方式w 适配器方式实例与解析w 实例一:仿活力器人 DogAdapter+cry ()move ().: void: voidRobot+cry ()move ().: void: voidDog+wang ()ru

8、n ().: void: void适配器方式w 方式优缺陷w 适配器方式的优点如下:w 将目的类和适配者类解耦,经过引入一个适配器类来重用现有的适配者类,而无需修正原有代码。w 添加了类的透明性和复用性,将详细的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。w 灵敏性和扩展性都非常好,经过运用配置文件,可以很方便地改换适配器,也可以在不修正原有代码的根底上添加新的适配器类,完全符合“开闭原那么。适配器方式w 方式优缺陷w 类适配器方式还具有如下优点:w 由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵敏性更强。w 类适配器方式的

9、缺陷如下:w 对于Java、C#等不支持多重承袭的言语,一次最多只能适配一个适配者类,而且目的笼统类只能为笼统类,不能为详细类,其运用有一定的局限性,不能将一个适配者类和它的子类都适配到目的接口。适配器方式w 方式优缺陷w 对象适配器方式还具有如下优点:w 一个对象适配器可以把多个不同的适配者适配到同一个目的,也就是说,同一个适配器可以把适配者类和它的子类都适配到目的接口。w 对象适配器方式的缺陷如下:w 与类适配器方式相比,要想置换适配者类的方法就不容易。假设一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进展

10、适配,实现过程较为复杂。适配器方式w 方式运用w 在以下情况下可以运用适配器方式:w 系统需求运用现有的类,而这些类的接口不符合系统的需求。w 想要建立一个可以反复运用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可以在未来引进的类一同义务。适配器方式w 方式运用w (1) Sun公司在1996年公开了Java言语的数据库衔接工具JDBC,JDBC使得Java言语程序可以与数据库衔接,并运用SQL言语来查询和操作数据。JDBC给出一个客户端通用的笼统接口,每一个详细数据库引擎如SQL Server、Oracle、MySQL等的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间

11、的适配器软件。笼统的JDBC接口和各个数据库引擎API之间都需求相应的适配器软件,这就是为各个不同数据库引擎预备的驱动程序。适配器方式w 方式运用w (2)在Spring AOP框架中,对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型借助适配器方式来实现。public interface AdvisorAdapter /将一个Advisor适配成MethodInterceptor MethodInterceptor getInterceptor(Advisor advisor); /判断此适配器是否支持特定的Advice boolean supports

12、Advice(Advice advice); 适配器方式w 方式扩展w 缺省适配器方式(Default Adapter Pattern)w 当不需求全部实现接口提供的方法时,可先设计一个笼统类实现接口,并为该接口中每个方法提供一个默许实现空方法,那么该笼统类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想运用其一切的方法的情况。因此也称为单接口适配器方式。 适配器方式w 方式扩展w 双向适配器 w 在对象适配器的运用过程中,假设在适配器中同时包含对目的类和适配者类的援用,适配者可以经过它调用目的类中的方法,目的类也可以经过它调用适配者类中的方法,那么该适配器就是一个双向适配器

13、。适配器方式w 方式扩展w 双向适配器 adapteetargetAdapter-adapteetarget: Adaptee: Target+request ()specificRequest ()setTarget (Target target)setAdaptee (Adaptee adaptee).Target+ request ().adaptee.specificRequest();Adaptee+ specificRequest ().target.request();ConcreteTarget+ request ().ConcreteAdaptee+ specificRequ

14、est ().适配器方式总结w 适配器方式用于将一个接口转换成客户希望的另一个接口,适配器方适配器方式用于将一个接口转换成客户希望的另一个接口,适配器方式使接口不兼容的那些类可以一同义务,其别名为包装器。适配器方式使接口不兼容的那些类可以一同义务,其别名为包装器。适配器方式既可以作为类构外型方式,也可以作为对象构外型方式。式既可以作为类构外型方式,也可以作为对象构外型方式。w 适配器方式包含四个角色:目的笼统类定义客户要用的特定领域的接适配器方式包含四个角色:目的笼统类定义客户要用的特定领域的接口;适配器类可以调用另一个接口,作为一个转换器,对适配者和笼口;适配器类可以调用另一个接口,作为一个

15、转换器,对适配者和笼统目的类进展适配,它是适配器方式的中心;适配者类是被适配的角统目的类进展适配,它是适配器方式的中心;适配者类是被适配的角色,它定义了一个曾经存在的接口,这个接口需求适配;在客户类中色,它定义了一个曾经存在的接口,这个接口需求适配;在客户类中针对目的笼统类进展编程,调用在目的笼统类中定义的业务方法。针对目的笼统类进展编程,调用在目的笼统类中定义的业务方法。w 在类适配器方式中,适配器类实现了目的笼统类接口并承袭了适配者在类适配器方式中,适配器类实现了目的笼统类接口并承袭了适配者类,并在目的笼统类的实现方法中调用所承袭的适配者类的方法;在类,并在目的笼统类的实现方法中调用所承袭

16、的适配者类的方法;在对象适配器方式中,适配器类承袭了目的笼统类并定义了一个适配者对象适配器方式中,适配器类承袭了目的笼统类并定义了一个适配者类的对象实例,在所承袭的目的笼统类方法中调用适配者类的相应业类的对象实例,在所承袭的目的笼统类方法中调用适配者类的相应业务方法。务方法。 w 适配器方式的主要优点是将目的类和适配者类解耦,添加适配器方式的主要优点是将目的类和适配者类解耦,添加了类的透明性和复用性,同时系统的灵敏性和扩展性都非了类的透明性和复用性,同时系统的灵敏性和扩展性都非常好,改换适配器或者添加新的适配器都非常方便,符合常好,改换适配器或者添加新的适配器都非常方便,符合“开闭原那么;类适

17、配器方式的缺陷是适配器类在很多开闭原那么;类适配器方式的缺陷是适配器类在很多编程言语中不能同时适配多个适配者类,对象适配器方式编程言语中不能同时适配多个适配者类,对象适配器方式的缺陷是很难置换适配者类的方法。的缺陷是很难置换适配者类的方法。w 适配器方式适用情况包括:系统需求运用现有的类,而这适配器方式适用情况包括:系统需求运用现有的类,而这些类的接口不符合系统的需求;想要建立一个可以反复运些类的接口不符合系统的需求;想要建立一个可以反复运用的类,用于与一些彼此之间没有太大关联的一些类一同用的类,用于与一些彼此之间没有太大关联的一些类一同义务。义务。桥接方式w 方式动机w将实现笼统部分与实现部

18、分分别,使它们各自可以独立地变化。w桥接方式w 方式动机w想象要绘制一幅图画,蓝天、白云、绿树、小鸟,假设画面尺寸很大,那么用蜡笔绘制就会遇到点费事。毕竟细细的蜡笔要涂出一片蓝天,是有些费事。假设有可以,最好有套大号蜡笔,粗粗的蜡笔很快能涂抹完成。至于颜色吗,最好每种颜色来支粗的,除了蓝天还有绿地呢。这样,假设一套12种颜色的蜡笔,我们需求两套24支,同种颜色的一粗一细。这样他就会想要是再有一套中号蜡笔就更好了,这样,不多不少总共36支蜡笔。w桥接方式桥接方式桥接方式w 方式构造桥接方式w Abstraction:定义笼统类的接口,维护一个指向Implementor类型的指针。w Refine

19、d Abstraction:扩展Abstraction定义的接口,改动和修正父类对笼统化的定义。 w Implementor:这个角色给出实现化角色的接口,但不给出详细的实现。必需指出的是,这个接口不一定和笼统化角色的接口定义一样,实际上,这两个接口可以非常不一样。实现化角色该当只给出底层操作,而笼统化角色该当只给出基于底层操作的更高一层的操作。 w Concrete Implementor:这个角色给出实现化角色接口的详细实现。桥接方式w 方式分析方式分析wabstract class Abstraction private Implementor imp; /笼统部分包含的实笼统部分包含的

20、实现者现者 public Implementor Imp set imp = value; get return imp; public abstract void Operation(); 桥接方式w 方式分析方式分析w派生笼统化角色派生笼统化角色w class RefinedAbstraction : Abstraction public override void Operation() Imp.OperationImp(); /调用实现者的方法实调用实现者的方法实现操作现操作 桥接方式w 方式分析方式分析w实现者角色实现者角色 abstract class Implementor pu

21、blic abstract void OperationImp(); 桥接方式w 方式分析方式分析w详细实现者角色详细实现者角色A class ConcreteImplementorA : Implementor public override void OperationImp() Console.WriteLine(ConcreteImplementAs Operator !); 桥接方式w 方式分析方式分析w详细实现者角色详细实现者角色B class ConcreteImplementorB : Implementor public override void OperationImp(

22、) Console.WriteLine(ConcreteImplementBs Operator !); 桥接方式w 方式适用性方式适用性w假设一个系统需求在构件的笼统化角色和假设一个系统需求在构件的笼统化角色和详细化角色之间添加更多的灵敏性,防止在两个层次详细化角色之间添加更多的灵敏性,防止在两个层次之间建立静态的联络。之间建立静态的联络。 w设计要务虚现化角色的任何改动不该当影设计要务虚现化角色的任何改动不该当影响客户端,或者说实现化角色的改动对客户端是完全响客户端,或者说实现化角色的改动对客户端是完全透明的。透明的。 w一个构件有多于一个的笼统化角色和实现一个构件有多于一个的笼统化角色和

23、实现化角色,系统需求它们之间进展动态耦合。化角色,系统需求它们之间进展动态耦合。 w虽然在系统中运用承袭是没有问题的,但虽然在系统中运用承袭是没有问题的,但是由于笼统化角色和详细化角色需求独立变化,设计是由于笼统化角色和详细化角色需求独立变化,设计要求需求独立管理这两者。要求需求独立管理这两者。桥接方式w 方式运用方式运用w开关与台灯:任何台灯都包括灯泡和灯架两部开关与台灯:任何台灯都包括灯泡和灯架两部分,不同的灯泡可以与不同的台灯灯架匹配,可以只分,不同的灯泡可以与不同的台灯灯架匹配,可以只改换灯泡或只改换台灯灯架,灯泡与台灯灯架之改换灯泡或只改换台灯灯架,灯泡与台灯灯架之间存在一种交错的巨

24、烈变化,所以把灯和台灯间存在一种交错的巨烈变化,所以把灯和台灯“做死在做死在一同不是一种好的作法。可以运用桥接器方式使之解耦:一同不是一种好的作法。可以运用桥接器方式使之解耦:在台灯灯架上做一个灯口,可以用它来调用灯泡的在台灯灯架上做一个灯口,可以用它来调用灯泡的“发光的方法点亮灯泡,同时我们可以随意地改换我们喜发光的方法点亮灯泡,同时我们可以随意地改换我们喜欢的灯泡,而不用去换整个台灯灯架。欢的灯泡,而不用去换整个台灯灯架。w桥接方式w 为了实现灯架与灯泡之间的解耦,我们运用桥接器方式,为了实现灯架与灯泡之间的解耦,我们运用桥接器方式,笼统出一个笼统出一个“笼统化台灯,它有一个开关一个灯泡,

25、可笼统化台灯,它有一个开关一个灯泡,可以经过开关调用灯泡的发光方法来实现发光。同时我们也以经过开关调用灯泡的发光方法来实现发光。同时我们也为灯泡做了一个笼统,以使此灯的灯泡可以恰好安装在灯为灯泡做了一个笼统,以使此灯的灯泡可以恰好安装在灯架的灯口上。架的灯口上。 下面为笼统出来的灯架和灯泡派生两个灯泡和两个灯架下面为笼统出来的灯架和灯泡派生两个灯泡和两个灯架: 两个台灯的灯架:一个是旋钮式开关,另一个是按钮两个台灯的灯架:一个是旋钮式开关,另一个是按钮式开关。式开关。 两个灯泡:红色灯泡和蓝色灯泡。两个灯泡:红色灯泡和蓝色灯泡。 桥接方式w 笼统台灯笼统台灯 abstract class La

26、mp protected Light light; /台灯上的灯泡台灯上的灯泡 public Light Light set light = value; public abstract void OpenLight(); /台灯的开关台灯的开关 桥接方式w 旋钮台灯 class CircleLamp: Lamp private int v=0; /旋钮台灯翻开后,灯泡的最初电压 public override void OpenLight() /旋转台灯开关调亮灯泡 for (v = 0; v = 5; v+) light.Level = v; /根据电压设定灯泡发光强度 light.Shi

27、ne(); /灯泡发光 桥接方式w 按钮台灯按钮台灯 class SwitchLamp : Lamp private int v = 5; /翻开台灯开关后,灯泡的最翻开台灯开关后,灯泡的最初电压初电压 public override void OpenLight() /翻开按钮台翻开按钮台灯的开关灯的开关 light.Level = v; /根据电压设定灯泡发光强度根据电压设定灯泡发光强度 light.Shine();/灯泡发光灯泡发光 桥接方式w 灯泡笼统体灯泡笼统体w abstract class Light protected int level; /灯泡的发光强度灯泡的发光强度 public int Level set level = value; public abstract void Shine(); /灯泡的发光方法灯泡的发光方法 桥接方式w 红灯红灯w class RedLight:Light public ove

温馨提示

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

评论

0/150

提交评论