1. 程式人生 > >java設計模式精講 Debug 方式+記憶體分析 第12章 介面卡模式

java設計模式精講 Debug 方式+記憶體分析 第12章 介面卡模式

介面卡模式

12-1 介面卡模式講解

在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


12-2 介面卡模式coding

有一個被介面卡類:

public class Adaptee {
    public void adapteeRequest() {
        System.out.println("被適配者的方法");
    }
}

這個是目標方法的介面:

public interface Target {
    void request();
}

這個是目標方法的實現:

/** 具體的實現類 */
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("ConcreteTarget目標方法");
    }
}

而這個就是適配類:繼承於被適配類,實現目標方法的介面:

public class Adapter extends Adaptee implements
Target { @Override public void request() { super.adapteeRequest(); } }

我們來進行測試一下:

public class Test {
    public static void main(String[]args){
        Target target = new ConcreteTarget();
        target.request();

        /** 現在,我們就來通過介面卡類來進行實現 */
        Target adapterTarget =
new Adapter(); adapterTarget.request(); } }

測試結果如下:

ConcreteTarget目標方法
被適配者的方法


這個時候,我們呼叫適配類裡面的方法,然後轉到被適配類裡面的方法:
在這裡插入圖片描述
以上的就是類介面卡模式;
現在的類圖為:
在這裡插入圖片描述


現在,我們來說說物件介面卡模式:
同上面一樣:有一個目標介面

public interface Target {
    void request();
}

還有一個具體的目標類:

/** 具體的實現類 */
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("ConcreteTarget目標方法");
    }
}

以及被適配的類:

public class Adaptee {
    public void adapteeRequest() {
        System.out.println("被適配者的方法");
    }
}

適配類和上面的有一些不同,這裡被適配類不是繼承過來的,而是作為屬性組合到裡面來,然後通過物件來呼叫被適配類裡面的方法:

public class Adapter implements Target {

    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        adaptee.adapteeRequest();
    }
}

現在,我們來測試一下:我們在拷貝的時候,一定要注意包是否引對

public class Test {
    public static void main(String[]args){
        Target target = new ConcreteTarget();
        target.request();

        /** 現在,我們就來通過介面卡類來進行實現 */
        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

執行結果:和上面的類介面卡模式的執行結果一樣

ConcreteTarget目標方法
被適配者的方法


這個就是現在的類圖:
在這裡插入圖片描述
在繼承和組合的時候,我們優先使用組合;


我們再類引入一個生活場景:手機充電器的介面卡,將220V的交流電轉換成5V的直流電:
首先有一個被適配的類:220V的類

public class AC220 {
    public int outputAC220V() {
        int output = 220;
        System.out.println("輸出220V的交流電"+output+"V");
        return output;
    }
}

我們有一個目標方法的介面:轉為5V的直流電

public interface DC5 {
    int outputDC5V();
}

這個就是適配類:

public class PowerAdapter implements DC5 {

    private AC220 ac220 = new AC220();

    @Override
    public int outputDC5V() {
        int adapterInput = ac220.outputAC220V();
        /** 變壓器 */
        int adapterOutput = adapterInput / 44;
        System.out.println("通過PowerAdapter電源介面卡輸入AC"+adapterInput+"V"+"輸出DC:"+adapterOutput+"V");
        return adapterOutput;
    }
}

public class Test {
    public static void main(String[]args){
        DC5 dc5 = new PowerAdapter();
        dc5.outputDC5V();
    }
}

執行結果:

輸出220V的交流電220V
通過PowerAdapter電源介面卡輸入AC220V輸出DC:5V


12-3 介面卡模式原始碼解析(jdk+spring+springjpa+springmvc)

  1. XmlAdapter
  2. AdvisorAdapter
  3. 在JPA裡面也大量的使用到介面卡模式
  4. HandlerAdapter