动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.一个java正规表达式工具类.
.虚拟机监视器Xen和虚拟化技术(一.
.Myeclipse4.0 Tomcat5.0&nb.
.谈模式(Singleton Pattern)的变形.
.java Excel API 简介.
.Good Java Style: Part 1.
..par已被抛弃,Jboss标准.ejb3将步.
.使用 Easy Struts for Eclipse 开.
.关于java异常处理(讲义).
.java表达式中类型的自动提升.
.垃圾自动收集系统指导(2).
.JAVA的文件类和I/O系统简介.
.Javascript实例教程(17) 使用字符.
.Debian下Mysql实践.
.Java类中类属性和对象属性的初始.
.java swing 9.27 课程.
.Eclipse入门使用指南及开发Eclip.
.Struts 初学指南.
.javazip_0.8alpha二进制发布版(W.
.java编辑多语言的福音--推荐一个.

教程:适配器模式(Adapter Pattern)组图

发表日期:2008-1-5 |



  通常,客户类(clients of class)通过类的接口访问它提供的服务。有时,现有的类(existing class)可以提供客户类的功能需要,但是它所提供的接口不一定是客户类所期望的。这是由于现有的接口太具体或者缺乏具体或接口的名称与客户类所查找的不同等诸多不同原因导致的。
  
  在这种情况下,现有的接口需要转化(convert)为客户类期望的接口,这样保证了对现有类的重用。假如不进行这样的转化,客户类就不能利用现有类所提供的功能。适配器模式(Adapter Pattern)可以完成这样的转化。适配器模式建议定义一个包装类,包装有不兼容接口的对象。这个包装类指的就是适配器(Adapter),它包装的对象就是适配者(Adaptee)。适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作(work together)。
  
  在上面讨论的接口:
  
  (1)  不是指在Java编程语言中接口的概念,虽然类的接口可以通过JAVA借扩来定义。
  
  (2)  不是指由窗体和GUI控件所组成的GUI应用程序的用户接口。
  
  (3)  而是指类所报漏的,被其他类调用的编程接口,
  
  类适配器(Class Adapter)VS对象适配器(Object Adapter)
  
  适配器总体上可以分为两类??类适配器(Class Adapter)VS对象适配器(Object Adapter)
  
  类适配器:
  
  类适配器是通过继续类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口。当客户对象调用适配器类方法的时候,适配器内部调用它所继续的适配者的方法。
  
  对象适配器:
  

  对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。
  
  下表是类适配器(Class Adapter)和对象适配器(Object Adapter)的具体不同:
  
 教程:适配器模式(Adapter Pattern)组图(图一)

  类适配器(Class Adapter)  对象适配器(Object Adapter)
  
  基于继续概念  利用对象合成
  
  只能应用在适配者是接口,不能利用它子类的接口,当类适配器建立时,它就静态地与适配者关联  可以应用在适配者是接口和它的所有子类
  
  因为适配器是作为适配者的子类,所以适配器可能会重载适配者的一些行为。
  
  注重:在JAVA中,子类不能重载父类中声明为final的方法。  不能重载适配者的方法。
  
  注重:字面上,不能重栽只是因为没有继续。但是适配器提供包装方法可以按需要改变行为。
  
  客户类对适配者中声明为public的接口是可见的,  客户类和适配者是完全不关联的,只有适配器才能感知适配者接口。
  
  在JAVA应用程序中:
  
  适用于期待的接口是JAVA接口的形式,而不是抽象地或具体地类的形式。这是因为
  
  JAVA编程语言只答应单继续。因此,类适配器设计成适配者的子类。  在JAVA应用程序中:
  
  适用于当客户对象期望的接口是抽象类的形式,同时也可以应用于期望接口是Java接口的形式。
  
  例子:
  
  让我们建立一个验证给定客户地址的应用。这个应用是作为大的客户数据治理应用的一部分。
  
  让我们定义一个Customer类:
  Customer
  
 教程:适配器模式(Adapter Pattern)组图(图二)

  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
  
 教程:适配器模式(Adapter Pattern)组图(图三)

  Figure 20.2: Customer/USAddress Validator?Class Association
  
  但是当验证来自加拿大的客户时,就要对应用进行改进。这需要一个验证加拿大客户地址的验证类。让我们假设已经存在一个用来验证加拿大客户地址的使用工具类CAAddress,。
  
  从下面的CAAdress类的实现,可以发现CAAdress提供了客户类Customer类所需要的验证服务。但是它所提供的接口不用于客户类Customer所期望的。
  Listing 20.5: CAAdress Class with Incompatible Interface
  
  class CAAddress {
  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 class
  
  CAAdress类提供了一个isValidCanadianAddr方法,但是Customer期望一个声明在AddressValidator接口中的isValidAddress方法。
  
  接口的不兼容使得Customer对象利用现有的CAAdress类是困难的。一种意见是改变CAAdress类的接口,但是可能会有其他的应用正在使用CAAdress类的这种形式。改变CAAdress类接口会影响现在使用CAAdress类的客户。
  
  应用适配器模式,类适配器CAAdressAdapter可以继续CAAdress类实现AddressValidator接口。
  
 教程:适配器模式(Adapter Pattern)组图(图四)

  Figure 20.3: Class Adapter for the CAAddress Class
  Listing 20.6: CAAddressAdapter as a Class Adapter
  
  public class CAAddressAdapter extends CAAddress
  implements 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实现了AddressValidator接口,客户端对象访问适配器CAAdressAdapter对象是没有任何问题的。当客户对象调用适配器实例的isValidAddress方法的时候,适配器在内部把调用传递给它继续的isValidCanadianAddr方法。
  
  在Customer类内部,getValidator私有方法需要扩展,以至于它可以在验证加拿大客户的时候返回一个CAAdressAdapter实例。返回的对象是多态的,USAddress和CAAddressAdapter都实现了AddressValidator接口,所以不用改变。
  Listing 20.7: Customer Class Using the CAAddre
上一篇:外观设计模式组图(Fa?ade pattern) 人气:424
下一篇:Java深入分析之:使用Factory Method模式 人气:431
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵