8、適配器模式

適配器模式

前言

在現實生活中,常常出現兩個對象因接口不兼容而不能在一塊兒工做的實例,這時須要第三者進行適配。例如,講中文的人同講英文的人對話時須要一個翻譯,用直流電的筆記本電腦接交流電源時須要一個電源適配器,用計算機訪問照相機的 SD 內存卡時須要一個讀卡器等。java

在軟件設計中也可能出現:須要開發的具備某種業務功能的組件在現有的組件庫中已經存在,但它們與當前系統的接口規範不兼容,若是從新開發這些組件成本又很高,這時用適配器模式能很好地解決這些問題。app

什麼是適配器模式

適配器模式(Adapter Pattern):將一個接口轉換成客戶但願的另外一個接口,使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。適配器模式既能夠做爲類結構型模式,也能夠做爲對象結構型模式。測試

在適配器模式中,咱們經過增長一個新的適配器類來解決接口不兼容的問題,使得本來沒有任何關係的類能夠協同工做。this

根據適配器類與適配者類的關係不一樣,適配器模式可分爲對象適配器和類適配器兩種,在對象適配器模式中,適配器與適配者之間是關聯關係;在類適配器模式中,適配器與適配者之間是繼承(或實現)關係。翻譯

主要角色

適配器模式(Adapter)包含如下主要角色。設計

  1. 目標(Target)接口:當前系統業務所期待的接口,它能夠是抽象類或接口。
  2. 適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
  3. 適配器(Adapter)類:它是一個轉換器,經過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。

類適配器模式

類適配器模式的結構圖以下圖所示3d

gif

類適配器模式示例代碼:code

咱們能夠舉一個手機充電器的例子,通常手機充電的額定電壓是5V,然而家用電電壓是220V。這時候手機充電器就起到了一個適配器的做用,將220V的電壓轉成5V的電壓。對象

建立目標(Target)接口類即手機須要的額定電壓5V類blog

public interface Voltage5V {
    public int outPut5V();
}

建立適配者(Adaptee)類即家用電壓220V類,這個類就是須要被適配器適配的類。

public class Voltage220V {
    public int outPut220V(){
        int Voltage = 220;
        return Voltage;
    }
}

建立適配器(Adapter)類

public class VoltageAdapter extends Voltage220V implements Voltage5V {
    public int outPut5V() {
        int v = this.outPut220V();
        //假設這裏進行了電壓適配
        v = 5;
        return v;
    }
}

建立手機類

public class Phone {
    public void charging(Voltage5V v){
        if (v.outPut5V()==5){
            System.out.println("電壓爲5V,能夠充電!");
        }else{
            System.out.println("電壓不匹配");
        }
    }
}

測試類

public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }
}

/**
電壓爲5V,能夠充電!
*/

對象適配器模式

對象適配器模式和類適配器模式大同小異,只是適配器類再也不是繼承適配者類而是聚合了適配者類

對象適配器模式的結構圖以下圖所示

gif

將上面的例子改成對象適配器模式

只須要修改適配器類便可

public class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V v){
        voltage220V = v;
    }
    public int outPut5V() {
        if (null!=voltage220V) {
            int v = voltage220V.outPut220V();
            //假設這裏進行了電壓適配
            v = 5;
            return v;
        }else{
            throw new RuntimeException();
        }
    }
}

缺省適配器模式

缺省適配器模式(Default Adapter Pattern):當不須要實現一個接口所提供的全部方法時,可先設計一個抽象類實現該接口,併爲接口中每一個方法提供一個默認實現(空方法),那麼該抽象類的子類能夠選擇性地覆蓋父類的某些方法來實現需求,它適用於不想使用一個接口中的全部方法的狀況,又稱爲單接口適配器模式。缺省適配器模式是適配器模式的一種變體,其應用也較爲普遍。

相關文章
相關標籤/搜索