適配器模式【結構型模式】

一、引出適配器模式概念

我們要給手機充電,但是我們知道家用電是220v,而我們的手機一般是5v,如果我們直接使用那顯然是不行的。這時候我們就需要一個轉換器,也就是我們的充電器。它在內部把220v轉換成5v。

我們的適配器也是同理,當我們需要使用某個類但是不能直接使用,這個時候就需要適配器來進行一下轉換。


二、適配器

一個適配器包含了三種角色:

  • 資源對象(src)
  • 適配器(adapter)
  • 目標接口(dist)

2-1:類適配器

2-1-1:src 資源對象

// 220v 電壓提供者
public class Src220V {
    
    public int outPut220V(){
        int src = 220;
        return src;
    }
}

2-1-2:dist接口

// 提供一個5v的接口
public interface Dist5V {
    
    int outPut5v();
}

2-1-3:adapter 適配器

public class adapter extends Src220V implements Dist5V {

    @Override
    public int outPut5v() {
        int i = outPut220V();
        // ---- 具體的轉換業務
        
        // ---
        return i / 44;
    }
}

2-1-4:測試

public class Main {

    public static void main(String[] args) {
        new adapter().outPut5v();
    }
}

類適配器: 適配器繼承資源對象,然後實現目錄接口重寫裏面的方法。

總結

  • 優點:直接繼承了src類,可以重寫裏面的方法,試得Adapter更加的靈活。
  • 缺點:因爲Java裏面是單繼承的,這次繼承之後,我們後面就無法再繼承了,並且繼承src那麼dist就必須是接口。



2-2:對象適配器

類適配器,使用繼承存在問題。對象適配器使用組合的方式解決單繼承的問題。

2-2-1:src 資源對象 (不需要改變)

// 220v 電壓提供者
public class Src220V {
    
    public int outPut220V(){
        int src = 220;
        return src;
    }
}

2-2-2:dist接口 (不需要改變)

// 提供一個5v的接口
public interface Dist5V {

    int outPut5v();
}

2-2-3:adapter 適配器

public class adapter implements Dist5V {

    private Src220V src220V;

    public adapter(Src220V src220V){
        this.src220V = src220V;
    }

    @Override
    public int outPut5v() {
        int i = 0;
        if (src220V != null){
            i = src220V.outPut220V();
            // ---- 具體的轉換業務

            // ---
            i = i / 44;
        }
        return i;
    }
}

2-2-4:測試

public class Main {

    public static void main(String[] args) {
        new adapter(new Src220V()).outPut5v();
    }
}

總結

  • 優點:根據合成複用原則,使用組合代替了繼承。解決了繼承問題和dist必須是接口的問題。
  • 缺點:我們實現了 dist 接口,就必須實現裏面全部的方法,有些方法我們不需要也必須實現。

2-3:接口適配器

在JDK8之前,我們的解決辦法是讓一個抽象類實現接口裏面的方法(空實現),然後我們繼承抽象類就可以選擇性的覆蓋裏面的方法了。

在JDK8之後,我們的接口支持默認實現了,這樣的話,我們就不需要一箇中間抽象類了。

2-3-1:我們修改 dist 接口

public interface Dist5V {

    default int outPut5v(){
        return 5;
    }

    default int outPut8v(){
        return 8;
    }

    default int outPut10v(){
        return 10;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章