




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、通常,客户类(clients of class)通过类的接口访问它提供的服务。有时, 现有的类(existing class)可以提供客户类的功 能需要,但是它所提供的接 口不一定是客户类所期望的。这是由于现有的接口太详细或者缺乏详细或接口的 名称与客户类所查找的不同等诸多不同原因导致的。在这种情况下,现有的接口需要转化(convert)为客户类期望的接口,这 样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所 提供的功能。适配器模式(Adapter Pattern)可以完成这样的转化。适配器模式建议定义一 个包装类,包装有不兼容接口的对象。这个包装类指的就是适配器(Ada
2、pter), 它包装的对象就是适配者(Adaptee)。适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适 配 者的相应接口的调用。换句话说:当客户类调用适配器的方法时,在适配器 类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访 问适配者 类。因此,适配器可以使由于借口不兼容而不能交互的类可以一起工 作(work together)。在上面讨论的接口:不是指在JAVA编程语言中接口的概念,虽然类的接口可以通过 JAVA借扩来定义。不是指由窗体和GUI控件所组成的GUI应用程序的用户接口。而是指类所报漏的,被其他类调用的编程接口,类适配器(Class A
3、dapter)VS 对象适配器(Object Adapter)适配器总体上可以分为两类?类适配器(Class Adapter)VS对象适配器 (Object Adapter)类适配器:类适配器是通过继承类适配者类(Adaptee Class)实现的,另外类适配器 实现客户类所需要的接口。当客户对象调用适配器类方法的时候,适配器内部调 用它所继承的适配者的方法。对象适配器:对象适配器包含一个适配器者的引用(reference),与类适配器相同,对 象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时 候,对象适配器调它所包含的适配器者实例的适当方法。下表是类适配器(Class A
4、dapter)和对象适配器(Object Adapter)的详细 不同:类适配器)对象窗己器:OEj以竟埋就基于缝承撞念利用对蒙合成只能应用在适配者是接口,不能利用它子类 的接口,当类适配器建立时,它就静态地与 适配者关联可以应用在适配者是接口和它的所有子类因为适1己器是作为适配者的子类,所以适配 器可能会重载适目睹的一些行为。注意:在中,子类不育载父类中声 明为fii诅1的方法口不能重载适配者的方法。注意:字面上,不能重栽只是因为没有继承。但是适配器提供包装方法可以按需要改变行 为口客户类对适配者中声明为public的接口是可 见的,在JAVA应用程序中:适用于期待的接口是心接口的形式,而
5、不是抽象地或具体地类的形式-这是因为 点我端程语言只允许单缝承。因此,类适配 器设计成适配者的子类。客户类和适配者是完全不关联的,只有适配 器才有矗知适配者接口。在JAV-%应用程序中:适用于当客户对象期望的接口是抽象类的形 式,同时也可以应用于期望接口是Ja作接口 的形式。补充:类适配器(Class Adapter)对象适配器(Object Adapter)基于继承概念利用对象合成只能应用在适配者是接口,不能利用它子类的接口,当类适配器建立时,它 就静态地与适配者关联 可以应用在适配者是接口和它的所有子类,因为适配 器是作为适配者的子类,所以适配器可能会重载适配者的一些行为。注意:在JAVA
6、中,子类不能重载父类中声明为final的方法。不能重载适配者的方法。注意:字面上,不能重栽只是因为没有继承。但是适配器提供包装方法可以 按需要改变行为。客户类对适配者中声明为public的接口是可见的,客户类和适配者是完全不关联的,只有适配器才能感知适配者接口。在JAVA应用程序中:适用于期待的接口是JAVA接口的形式,而不是抽象地或具体地类的形式。这是因为JAVA编程语言只允许单继承。因此,类适配器设计成适配者的子类。 在JAVA应用程序中:适用于当客户对象期望的接口是抽象类的形式,同时也可以应用于期望接口是 Java接口的形式。例子:让我们建立一个验证给定客户地址的应用。这个应用是作为大的
7、客户数据管 理应用的一部分。让我们定义一个Customer类:CustomerFigure 20.1: Customer ClassListing 20.1: Customer Classclass Customer (2.3.4.5.6.class Customer (2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.public static final String public private private private publicstatic final StringStringStringString booleanUS = US;C
8、ANADA = Canada;publicaddress;name;zip, state,type;isValidAddress() (Customer(String inp_name, String inp_address, String inp_zip, String inp_state, String inp_type) (name address zip = statetype =inp_name;=inp_address;inp_zip;二 inp_state;inp_type; /end of class不同的客户对象创建Customer对象并调用(invoke) isValidA
9、ddress方 法验证客户地址的有效性。为了验证客户地址的有效性,Customer类期望利用 一个地址验证类(address validator class),这个验证类提供了在接口 AddressValidator 中声明的接口。Listing 20.2: AddressValidator as an Interfacepublic interface AddressValidator (public boolean isValidAddress(String inp_address,String inp_zip, String inp_state);/end of class让我们定义一个
10、USAddress的验证类,来验证给定的U.S地址。Listing 20.3: USAddress Classclass USAddress implements AddressValidator (public boolean isValidAddress(String inp_address,String inp_zip, String inp_state) (if (inp_address.trim(). length () 10)return false;if (inp_zip.trim(). length() 10)return false;if (inp_state.trim().
11、 length() != 2)return false;return true;/end of classUSAddress 类实现 AddressValidator 接口,因此 Customer 对象使用 USAddress实例作为验证客户地址过程的一部分是没有任何问题的。Listing 20.4: Customer Class Using the USAddress Classclass Customer (public boolean isValidAddress() (/get an appropriate address validatorAddressValidator valid
12、ator = getValidator(type);/Polymorphic call to validate the addressreturn validator.isValidAddress(address, zip, state);private AddressValidator getValidator(String custType) (AddressValidator validator = null;if (custType.equals(Customer.US) (validator = new USAddress();return validator; /end of cl
13、assFigure 20.2: Customer/USAddress Validator?Class Association但是当验证来自加拿大的客户时,就要对应用进行改进。这需要一个验证加 拿大客户地址的验证类。让我们假设已经存在一个用来验证加拿大客户地址的使 用工具类CAAddress。从下面的CAAdress类的实现,可以发现CAAdress提供了客户类Customer类所 需要的验证服务。但是它所提供的接口不用于客户类Customer所期望的。Listing 20.5: CAAdress Class with Incompatible Interfaceclass CAAddress
14、(public boolean isValidCanadianAddr(String inp_address,String inp_pcode, String inp_prvnc) (if (inp_address.trim(). length () 15)return false;if (inp_pcode.trim(). length() != 6)return false;if (inp_prvnc.trim(). length () 6)return false;return true;/end of classCAAdress 类提供了一个 isValidCanadianAddr 方
15、法,但是 Customer 期望一 个声明在 AddressValidator 接口中的 isValidAddress 方法。接口的不兼容使得Customer对象利用现有的CAAdress类是困难的。一种意 见是改变CAAdress类的接口,但是可能会有其他的应用正在使用CAAdress类的 这种形式。改变CAAdress类接口会影响现在使用CAAdress类的客户。应用适配器模式,类适配器CAAdressAdapter可以继承CAAdress类实现 AddressValidator 接口。Figure 20.3: Class Adapter for the CAAddress ClassLi
16、sting 20.6: CAAddressAdapter as a Class Adapterpublic class CAAddressAdapter extends CAAddressimplements AddressValidator (public boolean isValidAddress(String inp_address,String inp_zip, String inp_state) (return isValidCanadianAddr(inp_address, inp_zip,inp_state);/end of class因为适配器CAAdressAdapter实
17、现了 AddressValidator接口,客户端对象 访问适配器CAAdressAdapter对象是没 有任何问题的。当客户对象调用适配器 实例的isValidAddress方法的时候,适配器在内部把调用传递给它继承的 isValidCanadianAddr 方法。在Customer类内部,getValidator私有方法需要扩展,以至于它可以 在 验证加拿大客户的时候返回一个CAAdressAdapter实例。返回的对象是多态的, USAddress 和 CAAddressAdapter 都实现 了 AddressValidator 接口,所以不用 改变。Listing 20.7: Cus
18、tomer Class Using the CAAddressAdapter Classclass Customer (public boolean isValidAddress() (/get an appropriate address validatorAddressValidator validator = getValidator(type);/Polymorphiccall to validate the addressreturn validator.isValidAddress(address, zip, state); TOC o 1-5 h z private Addres
19、sValidator getValidator(String custType) (AddressValidator validator = null;if(custType.equals(Customer.US)(validator = new USAddress();if(type.equals(Customer.CANADA)(validator = new CAAddressAdapter();return validator;/end of classCAAddressAdapter设计和对AddressValidator (声明期望的接口)对象的 多态调用使Customer可以利用
20、接口不兼容CAAddress类提供的服务。Figure 20.4: Address Validation Application?Using Class AdapterFigure 20.5: Address Validation Message Flow?Using Class Adapter作为对象适配器的地址适配器当讨论以类适配器来实现地址适配器时,我们说客户类期望的 AddressValidator接口是Java接口形式。现在,让我们假设客户类期望 AddressValidator接口是抽象类而不是java接口。因为适配器CAAdapter必须 提供抽象类AddressValidatr
21、o中声明 的接口,适配器必须是AddressValidator 抽象类的子类、实现抽象方法。Listing 20.8: AddressValidator as an Abstract Classpublic abstract class AddressValidator (public abstract boolean isValidAddress(String inp_address,String inp_zip, String inp_state);/end of classListing 20.9: CAAddressAdapter Classclass CAAddressAdapter
22、 extends AddressValidator (public CAAddressAdapter(CAAddress address) (objCAAddress = address; TOC o 1-5 h z public boolean isValidAddress(String inp_address,String inp_zip, String inp_state) ( /end of class因为多继承在JAVA中不支持,现在适配器CAAddressAdapter不能继承现有 的CAAddress类,它已经使用了唯一一次继承其他类的机会。应用对象适配器模式,CAAddressAdapter可以包含一个适配者CAAddress 的一个实例。当适配器第一次创建的时候,这个适配者的实例通过客户端传递给 适配器。通常,适配者实例可以通过下面两种方式提供给包装它的适配器。(1)对象适配器的客户端可以传递一个适配者的实例给适配器。这种 方式在选择类的形式上有很大的灵活性,但是客户端感知了适配者或者适配过 程。这种方法在适配器不但需要适配者对象行为而且需要特定状态时很适合。(2)适配器可以自己创建适配者实例。这种方法相对来说缺乏灵活性。 适用于适配器只需要适配者对象的行为而不需要适配者对象的特定状态的情况。Figure 20.6: Object Adapte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度工伤人员伤残评定及赔偿协议
- 2025年度集体合同协商中的劳动争议处理
- 2025年度幼儿园保安聘用合同标准范本
- 二零二五年度专业护工针对心血管疾病病人护理合同
- 2025年度中小企业发展基金借款连带担保人合同
- 2025年度单位食堂承包及员工满意度提升协议
- 2025年度知识产权股份代持许可使用协议
- 2025年度国际文化交流项目合作诚意金协议
- 2025年度工程监理个人劳动合同(工程质量安全管理)
- 2025年度航空航天器复合材料维修合同
- 湖南科技职业学院单招职业技能测试参考试题库(含答案)
- 玻璃分化板制作工艺
- 虹吸现象讲解
- 设备采购计划书
- 长兴县合溪水库清淤工程(一期)环境影响报告
- 粒籽源永久性植入治疗放射防护要求
- 新闻选题申报单
- 医学伦理审查申请表
- 《计算机安全基础》课件
- 养老院行业现状分析-2023年中国养老院行业市场发展前景研究报告-智研咨询
- 住房公积金贷款申请书
评论
0/150
提交评论