適配器模式--Adapter Pattern

import java.util.HashMap;
import java.util.Map;


public class Adapter {

//接口一及其實現類代碼:
interface IUserInfo {
   public abstract String getUserName();
   public abstract String getHomeAddress();
   public abstract String getMobileNumber();
   public abstract String getOfficeNumber();
   public abstract String getJobPosition();
   public abstract String getHomeTelNumber();
}

class UserInfoImpl implements IUserInfo {
   public String getHomeAddress() {
      return "HomeAddress:教工路197號";
   }
   public String getHomeTelNumber() {
      return "HomeTelNumber:110";
   }
   public String getMobileNumber() {
      return "MobileNumber:001";
   }
   public String getOfficeNumber() {
      return "OfficeNumber:002";
   }
   public String getUserName() {
      return "UserName:tang";
   }
   public String getJobPosition() {
      return "JobPosition:CEO";
   }
}

//接口二及其實現類代碼:
interface IOuterUser {
   public abstract Map<String,String> getUserBaseInfo();
   public abstract Map<String,String> getUserOfficeInfo();
   public abstract Map<String,String> getUserHomeInfo();
}

class OuterUserImpl implements IOuterUser {
   public Map<String,String> getUserBaseInfo() {
      Map<String,String> map=new HashMap<String,String>();
      map.put("UserName", "he");
      map.put("MobileNumber", "100");
      return map;
   }
   public Map<String,String> getUserHomeInfo() {
      Map<String,String> map=new HashMap<String,String>();
      map.put("HomeAddress", "文一西路197號");
      map.put("HomeTelNumber","011");
      return map;
   }
   public Map<String,String> getUserOfficeInfo() {
      Map<String,String> map=new HashMap<String,String>();
      map.put("JobPosition", "CFO");
      map.put("OfficeNumber", "200");
      return map;
   }
}

/*

* 顯然,接口一和接口二及其各自的實現類,在內容上是相關和相似的,但是在接口定義的結構上卻是異構的,
* 不相同的。如何將這兩個接口整合起來?這就是Adapter適配器需要做的事。
     * 適配器模式和現實生活中的適配器原理相同,拿熟悉的適配器—變壓器爲例。當輸入端的電壓有差異時,
     * 需要將通過變壓器將電壓進行轉換,轉換成符合輸出端要求的電壓。
     * 變壓器的功能就是將輸入端的不同電壓轉換成輸出端要求的固定電壓。
     * 上面的兩個異構的接口如何整合?代碼如下:
     * 
* */
class OuterUserInfo extends OuterUserImpl implements IUserInfo {
   public String getHomeAddress() {
      return super.getUserHomeInfo().get("HomeAddress");
   }
   public String getHomeTelNumber() {
      return super.getUserHomeInfo().get("HomeTelNumber");
   }
   public String getJobPosition() {
      return super.getUserOfficeInfo().get("JobPosition");
   }
   public String getMobileNumber() {
      return super.getUserBaseInfo().get("MobileNumber");
   }
   public String getOfficeNumber() {
      return super.getUserOfficeInfo().get("OfficeNumber");
   }
   public String getUserName() {
      return super.getUserBaseInfo().get("UserName");
   }
}

public static void main(String[] args) {
Adapter ad = new Adapter();
                IUserInfo user = ad.new UserInfoImpl();
        System.out.println(user.getHomeAddress());             //HomeAddress:教工路197號
        System.out.println(user.getHomeTelNumber());           //HomeTelNumber:110
      
       IOuterUser outUser = ad.new OuterUserImpl();
        System.out.println(outUser.getUserHomeInfo());         //{HomeAddress=文一西路197號, HomeTelNumber=011}
      
       //適配器模式往往是在二次開發中,需要擴展類功能時使用。
        IUserInfo outerUserInfo = ad.new OuterUserInfo();
        System.out.println(outerUserInfo.getHomeAddress());    //文一西路197號
        System.out.println(outerUserInfo.getHomeTelNumber());  //011
    }

/*
* 上面的例子也許是簡單了點,可能我們在不知道什麼是適配器模式的情況下,
* 遇到上面的情況(需要整合兩個異構的接口),也能寫出相應的正確代碼。
* 但是例子終究只是例子,它將實際情況抽象和簡化了。可不管是例子還是實際的開發中遇到的情況,
* 所體現出來的適配器模式的思想還是表現得淋漓盡致的。我覺得,適配器的思想就是:在進行功能擴展時候,
* 爲了儘可能的兼容已有的代碼,使用一箇中間過渡類或者接口,將需要編寫的新代碼和已有代碼進行整合,
* 使得這個中間過渡類能夠滿足兩者的要求。畢竟,將之前代碼全部推倒重來不是明智的選擇。

* */
}


文章出處: http://blog.sina.com.cn/s/blog_6ac6965a0100towi.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章