国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

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

  通常,客戶類(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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 林周县| 高淳县| 绥芬河市| 封丘县| 哈巴河县| 普兰县| 西藏| 富川| 马公市| 宜丰县| 阳朔县| 日喀则市| 台湾省| 漳平市| 阿克陶县| 玉溪市| 泸西县| 宣恩县| 营口市| 武夷山市| 平遥县| 吉木萨尔县| 平和县| 元谋县| 合阳县| 通州市| 江油市| 仁布县| 城市| 丰镇市| 涡阳县| 东乡县| 勃利县| 霍林郭勒市| 邵东县| 石狮市| 昌宁县| 囊谦县| 余江县| 恩施市| 绥宁县|