亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

教程:適配器模式(Adapter Pattern)組圖

2019-11-18 12:15:40
字體:
來源:轉載
供稿:網友

  通常,客戶類(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)的具體不同:
  
 教程:適配器模式(Adapter Pattern)組圖(圖一)

  類適配器(Class Adapter)  對象適配器(Object Adapter)
  
  基于繼續概念  利用對象合成
  
  只能應用在適配者是接口,不能利用它子類的接口,當類適配器建立時,它就靜態地與適配者關聯  可以應用在適配者是接口和它的所有子類
  
  因為適配器是作為適配者的子類,所以適配器可能會重載適配者的一些行為。
  
  注重:在JAVA中,子類不能重載父類中聲明為final的方法。  不能重載適配者的方法。
  
  注重:字面上,不能重栽只是因為沒有繼續。但是適配器提供包裝方法可以按需要改變行為。
  
  客戶類對適配者中聲明為public的接口是可見的,  客戶類和適配者是完全不關聯的,只有適配器才能感知適配者接口。
  
  在JAVA應用程序中:
  
  適用于期待的接口是JAVA接口的形式,而不是抽象地或具體地類的形式。這是因為
  
  JAVA編程語言只答應單繼續。因此,類適配器設計成適配者的子類?! ≡贘AVA應用程序中:
  
  適用于當客戶對象期望的接口是抽象類的形式,同時也可以應用于期望接口是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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一二区| 日韩av电影院| 亚洲精品美女久久| 欧美精品电影免费在线观看| 一区二区三区视频在线| 九九精品在线观看| 懂色av影视一区二区三区| 91麻豆国产语对白在线观看| 欧美怡红院视频一区二区三区| 久久精品视频va| 欧美性受xxxx白人性爽| 亚洲欧美中文在线视频| 国产主播欧美精品| 中文字幕不卡av| 亚洲free性xxxx护士hd| 欧美放荡办公室videos4k| 亚洲小视频在线观看| 日本精品性网站在线观看| www.久久久久| 在线激情影院一区| 久久伊人精品天天| 欧洲精品在线视频| 亚洲天堂一区二区三区| 欧美激情高清视频| 久热99视频在线观看| 亚洲欧美综合区自拍另类| 韩剧1988免费观看全集| 在线观看精品自拍私拍| 久久精品视频播放| 98视频在线噜噜噜国产| 91精品国产自产在线| 国产一区二区三区在线视频| 成人av电影天堂| 久久久国产影院| 国产在线精品成人一区二区三区| 成人免费在线网址| 大胆欧美人体视频| 欧洲精品毛片网站| 久久影视免费观看| 国产手机视频精品| 亚洲色图校园春色| 国产精品99久久久久久白浆小说| 91精品视频专区| 欧美福利小视频| 国产成人精品免费视频| 久久夜精品va视频免费观看| 亚洲香蕉av在线一区二区三区| 久久精品久久久久| 九九精品视频在线观看| 成人国产精品一区二区| 久久精品国产69国产精品亚洲| 亚洲精品久久久久久下一站| 欧美激情一级欧美精品| 45www国产精品网站| 欧美xxxx14xxxxx性爽| 少妇av一区二区三区| 亚洲黄色www网站| 欧美精品aaa| 久久资源免费视频| 国产成人精品免费久久久久| 亚洲欧美一区二区三区四区| 久久99国产综合精品女同| 日韩一级黄色av| 国产999精品视频| 中文字幕日韩欧美精品在线观看| 中文字幕免费国产精品| 国产精品爱啪在线线免费观看| 97精品国产aⅴ7777| 久久精品视频99| 国内精久久久久久久久久人| 91国内免费在线视频| 精品美女永久免费视频| 国产亚洲成av人片在线观看桃| www亚洲精品| 最近中文字幕日韩精品| 亚洲xxxx18| 成人精品aaaa网站| 韩国v欧美v日本v亚洲| 亚洲最大激情中文字幕| 亚洲欧美综合图区| 欧美一级视频免费在线观看| 亚洲图片在区色| 91爱爱小视频k| 欧美激情视频一区二区| 久久久久久69| 91色琪琪电影亚洲精品久久| 77777少妇光屁股久久一区| 精品久久久久久久大神国产| 国产精品久久久久久久久久免费| 欧美黑人国产人伦爽爽爽| 国产精品观看在线亚洲人成网| 久久久久久久久久久成人| 国产精品久久久久7777婷婷| 亚洲综合大片69999| 国产精品啪视频| 一本色道久久综合狠狠躁篇怎么玩| 欧美老肥婆性猛交视频| 久久激情视频久久| 黄色成人在线播放| 日韩成人激情在线| 日本aⅴ大伊香蕉精品视频| 久久国产精品久久久久| 国产福利视频一区二区| 午夜欧美不卡精品aaaaa| 成人精品aaaa网站| 久久久久久久久国产| 中文字幕久热精品在线视频| 日韩欧美在线视频免费观看| 91精品久久久久久久久| 国产亚洲aⅴaaaaaa毛片| 亚洲a中文字幕| 国产一区二区三区直播精品电影| 国产一区二区三区网站| 日本精品免费一区二区三区| 成人黄色片网站| 久久国产精品电影| 国产视频999| 国产日韩亚洲欧美| 亚洲丝袜av一区| 国产精品久久久久免费a∨| 中文字幕久热精品视频在线| 亚洲精品资源美女情侣酒店| 成人a免费视频| 精品伊人久久97| 欧美一级高清免费| 色综合久久悠悠| 成人福利在线视频| 人人做人人澡人人爽欧美| 亚洲一品av免费观看| 亚洲国产高清高潮精品美女| 国模gogo一区二区大胆私拍| 国产精品欧美亚洲777777| 亚洲福利视频免费观看| 欧美日韩国产一区在线| 久久久久久91| 国外成人免费在线播放| 日本成人黄色片| 理论片在线不卡免费观看| 这里只有精品在线观看| 97精品欧美一区二区三区| 久久影视电视剧免费网站清宫辞电视| 欧美性猛交xxxx黑人猛交| 国产精品成人一区二区三区吃奶| 欧美日韩国产一区在线| 黄色成人在线免费| 91最新在线免费观看| 国产日韩中文字幕| 亚洲一区二区三区视频播放| 国产欧亚日韩视频| 成人网在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 欧美一乱一性一交一视频| 精品国产欧美成人夜夜嗨| 成人黄在线观看| 国产精品色午夜在线观看| 欧美成人在线网站| 欧美日韩国产精品一区| 欧洲永久精品大片ww免费漫画| 日韩av中文字幕在线免费观看| 欧美性生交大片免网| 欧美激情视频在线观看| 久久人人看视频| 久久久视频在线| 国产精品久久久久久影视|