java設計模式-適配器模式

    適配器模式有兩種類型,類適配器模式對象適配器模式。因爲類適配器模式經過多重繼承對一個接口與另外一個接口進行匹配,而C#、java等語言都不支持多重繼承,於是這裏只是介紹對象適配器。java

適配器模式官方定義

    將一個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做。ide

我的理解

    舉個栗子,假如我如今有錢了,去巴厘島去旅遊。當地提供的住宿環境是那種歐式的插線板,但我手機充電器是中國通用的那種兩個插線頭。在這種狀況下我手機已經沒電了必需要充電,擔我直接充不了怎麼辦。去當地的超市買來了一個轉接頭,拿回住的地方用轉接頭就能夠充電了。網上這張圖給我啓發很大以下spa

    轉接頭(Adapter模式)使得本來因爲插頭與線板(接口)不兼容而不能一塊兒充電(工做)的那些線(類)能夠在一塊兒工做。code

適配器模式中的角色

  • 目標接口(Target):客戶所期待的接口。目標能夠是具體的或抽象的類,也能夠是接口。
  • 須要適配的類(Adaptee):須要適配的類或適配者類。
  • 適配器(Adapter):經過包裝一個須要適配的對象,把原接口轉換成目標接口。 

實現方法看看效果 

    公司如今是作本身產品(速),可是老闆發現一個新的商機又開發出來一個新的產品(玩)。但願在(玩)產品上同事能夠看到(速)產品中的用戶。但因爲兩個產品不是同一技術團隊研發的。在技術與開發規範中都不是很統一。適配器模式就是要解決這樣的問題對象

代碼清單:(玩)用戶信息接口繼承

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

適配器模式的優缺點

優勢

  • 適配器模式可讓兩個沒有任何關係的類在一塊兒運行,只要適配器這個角色可以搞定他們就成。
  • 增長了類的透明性
  • 提升了類的複用度
  • 靈活性很是好

缺點

  • 對於對象適配器來講,更換適配器的實現過程比較複雜。

適配器模式的使用場景

    適配器模式的使用場景主要記住一點就足夠了:你想修改一個已經投產中的接口時,適配器模式多是最適合你的模式。

相關文章
相關標籤/搜索