適配器模式有兩種類型,類適配器模式和對象適配器模式。因爲類適配器模式經過多重繼承對一個接口與另外一個接口進行匹配,而C#、java等語言都不支持多重繼承,於是這裏只是介紹對象適配器。java
將一個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做。ide
舉個栗子,假如我如今有錢了,去巴厘島去旅遊。當地提供的住宿環境是那種歐式的插線板,但我手機充電器是中國通用的那種兩個插線頭。在這種狀況下我手機已經沒電了必需要充電,擔我直接充不了怎麼辦。去當地的超市買來了一個轉接頭,拿回住的地方用轉接頭就能夠充電了。網上這張圖給我啓發很大以下spa
轉接頭(Adapter模式)使得本來因爲插頭與線板(接口)不兼容而不能一塊兒充電(工做)的那些線(類)能夠在一塊兒工做。code
公司如今是作本身產品(速),可是老闆發現一個新的商機又開發出來一個新的產品(玩)。但願在(玩)產品上同事能夠看到(速)產品中的用戶。但因爲兩個產品不是同一技術團隊研發的。在技術與開發規範中都不是很統一。適配器模式就是要解決這樣的問題對象
代碼清單:(玩)用戶信息接口繼承
public interface IUserInfo { public String getUserName(); public String getUserPhone(); public String getUserJobPosition(); }
代碼清單:(玩)用戶信息實現方法接口
public class UserInfo implements IUserInfo { @Override public String getUserName() { System.out.println("張三"); return null; } @Override public String getUserPhone() { System.out.println("15811111111"); return null; } @Override public String getUserJobPosition() { System.out.println("CEO"); return null; } }
代碼清單:(速)用戶信息實現方法開發
public class Perpersonnel { public Map getUserBasic(){ HashMap<Object, String> userBasic = new HashMap<Object, String>(); userBasic.put("UserName","王五"); userBasic.put("UserPhone","18811111111"); return userBasic; } public Map getUserJob(){ HashMap<Object, String> userJobPosition = new HashMap<Object, String>(); userJobPosition.put("JobPosition","CTO"); return userJobPosition; } }
代碼清單:主角適配器get
public class UserInfoAdapter extends Perpersonnel implements IUserInfo{ public String getUserName() { String userName = (String) getUserBasic().get("UserName"); System.out.println(userName); return userName; } public String getUserPhone() { String UserPhone = (String) getUserBasic().get("UserPhone"); System.out.println(UserPhone); return UserPhone; } public String getUserJobPosition() { String JobPosition = (String) getUserJob().get("JobPosition"); System.out.println(JobPosition); return JobPosition; } }
代碼清單:(玩)產品上查詢兩個產品的用戶信息產品
public class Test { public static void main(String[] args) { IUserInfo iuserInfo = new UserInfo(); iuserInfo.getUserName(); iuserInfo.getUserPhone(); iuserInfo.getUserJobPosition(); System.out.println("---------------------"); IUserInfo iuserInfoAdapter = new UserInfoAdapter(); iuserInfoAdapter.getUserName(); iuserInfoAdapter.getUserPhone(); iuserInfoAdapter.getUserJobPosition(); } }
查詢出來的結果以下:
張三 15811111111 CEO --------------------- 王五 18811111111 CTO
優勢
缺點
適配器模式的使用場景主要記住一點就足夠了:你想修改一個已經投產中的接口時,適配器模式多是最適合你的模式。