設計模式_適配器模式

Adapter Pattern 
    Converl the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的倆個類能夠在一起工作)

不認識的單詞
incompatible 不相容,矛盾 

例子
 倆套人力資源管理系統,倆個不同接口設計,當倆者需要交互時,該如何做? 

本公司接口如下 

public interface IUserInfo {
 public String getUserName();
 public String getHomeAddress();
 public String getMobileNumber();
 public String getOfficeTel();
 public String getJobPosition();
 public String getHomeTel();
}

//本系統
public class UserInfo implements IUserInfo {
 public String getHomeAddress() {
  System.out.println("這裏是員工的家庭地址");
  return null;
 }
 public String getHomeTel() {
  System.out.println("員工的家庭電話是...");
  return null;
 }
 public String getJobPosition() {
  System.out.println("員工的職位");
  return null;
 }
 public String getMobileNumber() {
  System.out.println("員工的手機號碼");
  return null;
 }
 public String getOfficeTel() {
  System.out.println("員工的辦公室號碼");
  return null;
 }
 public String getUserName() {
  System.out.println("員工姓名");
  return null;
 }
}


中介公司接口如下 
@SuppressWarnings("unchecked")
public interface IOuterUser {
 public Map getUserBaseInfo();
 public Map getUserOfficeInfo();
 public Map getUserHomeInfo();
}
//另一個系統
public class OuterUser implements IOuterUser {
 @SuppressWarnings("unchecked")
 public Map getUserBaseInfo() {
  HashMap baseInfoMap=new HashMap();
  baseInfoMap.put("userName", "這個員工叫Jack");
  baseInfoMap.put("mobileNumber", "這個員工電話號碼是....");
  return baseInfoMap;
 }
 @SuppressWarnings("unchecked")
 public Map getUserHomeInfo() {
  HashMap homeInfoMap=new HashMap();
  homeInfoMap.put("homeTelNumber", "這個員工家庭號碼是");
  homeInfoMap.put("homeAddress", "這個員工家庭地址是....");
  return homeInfoMap;
 }
 @SuppressWarnings("unchecked")
 public Map getUserOfficeInfo() {
  HashMap userOfficeInfoMap=new HashMap();
  userOfficeInfoMap.put("jobPosition", "這個員工職位是");
  userOfficeInfoMap.put("officeTelNumber", "這個員工辦公號碼是....");
  return userOfficeInfoMap;
 }
}

需求
     本公司借聘一箇中介公司,信息存儲在中介公司的系統中, 如果借用人員信息變更,本公司系統需要立馬更新。  

分析
    倆個系統不同,需要將外系統轉化成本系統,拿到外系統數據,然後轉化成本系統數據,使用RMI可以將遠程的對象當成是本地的對象使用。

/*
 * 適配器
 * OuterUser爲另一個系統的信息管理
 * IUserInfo爲自身系統接口
 * so,問題就是解決在本系統的基礎上再增加一個,完成對外來系統的包裝,使得能在本系統使用
 * 重心還是自身接口的實現,引入外來的源數據提供者OuterUser
 */
public class OuterUserInfo extends OuterUser implements IUserInfo {
 private Map baseInfo = super.getUserBaseInfo();
 private Map homeInfo = super.getUserHomeInfo();
 private Map officeInfo = super.getUserOfficeInfo();
 
 public String getHomeAddress() {
  String homeAddress=(String) this.homeInfo.get("homeAddress");
  System.out.println(homeAddress);
  return homeAddress;
 }
 //就不多寫了
 public String getHomeTel() {
  return null;
 }
 //就不多寫了
 public String getJobPosition() {
  return null;
 }
 //就不多寫了
 public String getMobileNumber() {
  return null;
 }
 //就不多寫了
 public String getOfficeTel() {
  return null;
 }
 //就不多寫了
 public String getUserName() {
  return null;
 }
}

這樣在原來系統的基礎之上增加了一個外來人員管理類OuterUserInfo,實現了本系統接口的方法,這樣就實現了系統轉化。也遵循開閉原則。
注意,外系統的遠程對象可以通過構造方法來傳遞,也可以通過繼承關係,不管怎麼說,遠程對象一定是這個新類的成員,不然沒法轉。 

核心:實現本系統接口,加入外系統的各個模板塊,在方法中調用外系統模板塊中的方法,從而實現了轉化外接口,這樣一來,系統有選擇性的調用了。

優點 
    適配器可以讓倆個沒有任何關係的類在一起運行
    增加了類的透明性
    提高了複用性
    非常靈活

使用場景
    修改一個已經投產中的接口,比如系統擴展

注意事項 
    是爲了解決已經在服役的項目問題,一般在設計階段不用考慮,這是一種補救措施。

我是菜鳥,我在路上。

發佈了78 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章