設計模式總結篇系列:適配器模式(Adapter)


網上看到不少關於適配器模式的講解,其中對於適配器模式解釋的過於專業,一時不是特別理解適配器模式到底是用來干嘛的,具體的適用場景在哪,其最精髓的地方到底在哪。

本文結合自己的理解,闡述下對適配器模式的看法。

假設系統存在一個現有的類UserInfo:

 1 class UserInfo {  2 
 3     private Map<String, String> userBaseInfo;  4 
 5     public Map getUserBaseInfo() {  6         return userBaseInfo;  7  }  8 
 9     public void setUserBaseInfo(Map<String, String> userBaseInfo) { 10         this.userBaseInfo = userBaseInfo; 11  } 12 }

客戶端可以通過如下方式set、get員工基本信息:

 1 public class AdapterTest {  2 
 3     public static void main(String[] args) {  4         
 5         UserInfo oui = new UserInfo();  6         Map<String, String> inUserInfo = new HashMap<String, String>() {  7  {  8                 put("name", "corn");  9                 put("telNumber", "170xxxxxxxx"); 10  } 11  }; 12  oui.setUserBaseInfo(inUserInfo); 13 
14         // 原有取得員工基本信息的方式
15         Map<String, String> outUserInfo = oui.getUserBaseInfo(); 16         String name = outUserInfo.get("name"); 17         String telNumber = outUserInfo.get("telNumber"); 18         
19  } 20 }

有一天,基於某種原因(也許你看着這種取數據的方式不太爽,也許是系統間數據交換的原因等),你需要按照如下接口的方式取數據:

目標員工接口:

1 interface UserInterface { 2 
3     public String getName(); 4 
5     public String getTelNumber(); 6 
7 }

那么,現在的問題是,如何將一個既定的類轉換成按照目標接口的所期望的行為形式呢?

 

具體怎樣實現呢,可以通過如下方式進行:

 1 class UserAdapter extends UserInfo implements UserInterface {  2 
 3  @Override  4     public String getName() {  5         return (String) super.getUserBaseInfo().get("name");  6  }  7 
 8  @Override  9     public String getTelNumber() { 10         return (String) super.getUserBaseInfo().get("telNumber"); 11  } 12 
13 }

從上面的UserAdapter類定義中我們發現,UserAdapter不僅實現了UserInterface接口,同時還繼承了UserInfo類。在實現接口的getName()和getTelNumber()方法中,分別調用了UserInfo類中的相應方法並取得結果。由此可以滿足需求。在上述定義中,按照UserInterface、UserInfo和UserAdapter在場景中的目的不同,可以具體划分成如下角色:

UserInterface:目標角色——目標接口,系統所期待實現的目標;

UserInfo:源角色——當前已經存在的原有的實現類,即將被適配的類;

UserAdapter:適配器角色——將原有實現裝換為目標接口的實現。

簡單點說,適配器模式是指:定義一個類,將一個已經存在的類,轉換成目標接口所期望的行為形式。

在具體的實現過程中,又可以基於其實現層次是類層次還是對象層次,將其分為類適配器和對象適配器。如上所寫的是類適配器。

對象適配器使用組合代替繼承,將源角色視為適配器角色的屬性:

 1 class UserAdapter implements UserInterface {  2     
 3     private UserInfo userInfo;  4     
 5     public UserAdapter(){  6         
 7  }  8     
 9     public UserAdapter(UserInfo userInfo){ 10         this.userInfo = userInfo; 11  } 12 
13  @Override 14     public String getName() { 15         return (String) userInfo.getUserBaseInfo().get("name"); 16  } 17 
18  @Override 19     public String getTelNumber() { 20         return (String) userInfo.getUserBaseInfo().get("telNumber"); 21  } 22 
23 }

總體而言:適配器模式是指定義一個適配器類,將一個已經存在的類,轉換成目標接口所期望的行為形式。同時,一般來說,基於更多的推薦使用組合而不是繼承,因此,對象適配器可能使用更多。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM