網上看到不少關於適配器模式的講解,其中對於適配器模式解釋的過於專業,一時不是特別理解適配器模式到底是用來干嘛的,具體的適用場景在哪,其最精髓的地方到底在哪。
本文結合自己的理解,闡述下對適配器模式的看法。
假設系統存在一個現有的類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 }
總體而言:適配器模式是指定義一個適配器類,將一個已經存在的類,轉換成目標接口所期望的行為形式。同時,一般來說,基於更多的推薦使用組合而不是繼承,因此,對象適配器可能使用更多。
