百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

深入浅出Java设计模式之适配器模式

yuyutoo 2024-10-20 13:08 1 浏览 0 评论

通常,客户类(clients of class)通过类的接口访问它提供的服务。有时,现有的类(existing class)可以提供客户类的功能需要,但是它所提供的接口不一定是客户类所期望的。这是由于现有的接口太详细或者缺乏详细或接口的名称与客户类所查找的不同等诸多不同原因导致的。

在这种情况下,现有的接口需要转化(convert)为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能。适配器模式(Adapter Pattern)可以完成这样的转化。适配器模式建议定义一个包装类,包装有不兼容接口的对象。这个包装类指的就是适配器(Adapter),它包装的对象就是适配者(Adaptee)。适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作(work together)。

在上面讨论的接口

  • 不是指在JAVA编程语言中接口的概念,虽然类的接口可以通过JAVA借扩来定义。
  • 不是指由窗体和GUI控件所组成的GUI应用程序的用户接口。
  • 而是指类所报漏的,被其他类调用的编程接口,

类适配器(Class Adapter)VS对象适配器(Object Adapter)

适配器总体上可以分为两类:类适配器(Class Adapter)VS对象适配器(Object Adapter)

类适配器

类适配器是通过继承类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口。当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。

对象适配器

对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。

下表是类适配器(Class Adapter)和对象适配器(Object Adapter)的详细不同:

补充

类适配器(Class Adapter) 对象适配器(Object Adapter)

基于继承概念 利用对象合成

只能应用在适配者是接口,不能利用它子类的接口,当类适配器建立时,它就静态地与适配者关联 可以应用在适配者是接口和它的所有子类,因为适配器是作为适配者的子类,所以适配器可能会重载适配者的一些行为。

注意

在JAVA中,子类不能重载父类中声明为final的方法。 不能重载适配者的方法。

字面上,不能重栽只是因为没有继承。但是适配器提供包装方法可以按需要改变行为。

客户类对适配者中声明为public的接口是可见的, 客户类和适配者是完全不关联的,只有适配器才能感知适配者接口。

在JAVA应用程序中

适用于期待的接口是JAVA接口的形式,而不是抽象地或具体地类的形式。这是因为JAVA编程语言只允许单继承。因此,类适配器设计成适配者的子类。

在JAVA应用程序中

适用于当客户对象期望的接口是抽象类的形式,同时也可以应用于期望接口是Java接口的形式。

例子

让我们建立一个验证给定客户地址的应用。这个应用是作为大的客户数据管理应用的一部分。

让我们定义一个Customer类:

Customer

Figure 20.1: Customer Class

Listing 20.1: Customer Class

class Customer {
   public static final String US = "US";
   public static final String CANADA = "Canada";
   private String address;
   private String name;
   private String zip, state, type;
   public Boolean isValidAddress() {
   …
   …
   
 }
   public Customer(String inp_name, String inp_address,
   String inp_zip, String inp_state,
   String inp_type) {
   name = inp_name;
   address = inp_address;
   zip = inp_zip;
   state = inp_state;
   type = inp_type;
   
 }
   
}
//end of class

不同的客户对象创建Customer对象并调用(invoke)isValidAddress方法验证客户地址的有效性。为了验证客户地址的有效性,Customer类期望利用一个地址验证类(address validator class),这个验证类提供了在接口AddressValidator中声明的接口。

Listing 20.2: AddressValidator as an Interface

public interface AddressValidator {
   public Boolean isValidAddress(String inp_address,
   String inp_zip, String inp_state);
   
}
//end of class

让我们定义一个USAddress的验证类,来验证给定的U.S地址。

Listing 20.3: USAddress Class

class 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() < 5)
   return false;
   if (inp_zip.trim().length() > 10)
   return false;
   if (inp_state.trim().length() != 2)
   return false;
   return true;
   
 }
   
}
//end of class

USAddress类实现AddressValidator接口,因此Customer对象使用USAddress实例作为验证客户地址过程的一部分是没有任何问题的。

Listing 20.4: Customer Class Using the USAddress Class

class Customer {
   …
   …
   public Boolean isValidAddress() {
   //get an appropriate address validator
   AddressValidator validator = getValidator(type);
   //Polymorphic call to validate the address
   return 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 class

Figure 20.2: Customer/USAddress Validator Class Association

但是当验证来自加拿大的客户时,就要对应用进行改进。这需要一个验证加拿大客户地址的验证类。让我们假设已经存在一个用来验证加拿大客户地址的使用工具类CAAddress。

Java肖先生:专注于Java开发技术的研究与知识分享!

————END————

  • 点赞(感谢)
  • ...
  • 转发(感谢)
  • ...
  • 关注(感谢)
  • ...

相关推荐

jQuery VS AngularJS 你更钟爱哪个?

在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...

Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0

在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...

如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例

要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...

编程技巧:Jquery实时验证,指定长度的「负小数」

为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

编程技巧:Jquery实时验证,指定长度的「正小数」

为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...

jquery.validate检查数组全部验证

问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...

Vue进阶(幺叁肆):npm查看包版本信息

第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...

layui中使用lay-verify进行条件校验

一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...

jQuery是什么?如何使用? jquery是什么功能组件

jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...

django框架的表单form的理解和用法-9

表单呈现...

jquery对上传文件的检测判断 jquery实现文件上传

总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...

Nodejs之MEAN栈开发(四)-- form验证及图片上传

这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...

大数据开发基础之JAVA jquery 大数据java实战

上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...

推荐四个开源的jQuery可视化表单设计器

jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...

取消回复欢迎 发表评论: