設(shè)計模式:適配器模式

定義與類型

  • 定義:將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口
  • 使原本接口不兼容的類可以一起工作
  • 類型:結(jié)構(gòu)型

適用場景

  • 已經(jīng)存在的類,它的方法和需求不匹配時(方法結(jié)果相同或相似)
  • 不是軟件設(shè)計階段考慮的設(shè)計模式,是隨著軟件維護(hù),由于不同產(chǎn)品、不同廠家造成功能類似而接口不同情況下的解決方案

優(yōu)點

  • 能夠提高類的透明性和復(fù)用,現(xiàn)有類復(fù)用但不需要改變
  • 目標(biāo)類和適配器類解耦,提高程序擴(kuò)展性
  • 符合開閉原則

缺點

  • 適配器編寫過程需要全面考慮,可能會增加系統(tǒng)的復(fù)雜性
  • 增加系統(tǒng)代碼可讀的難度

擴(kuò)展

  • 對象適配器
  • 類適配器

相關(guān)設(shè)計模式

  • 適配器模式和外觀模式

代碼演示

類適配器

  1. 創(chuàng)建被適配者
/**
 * @author lijiayin
 */
public class Adaptee {
    
    public void adapteeRequest(){
        System.out.println("被適配者的方法");
    }
}
  1. 創(chuàng)建需要適配的接口
/**
 * @author lijiayin
 */
public interface Target {
    void request();
}
  1. 創(chuàng)建適配器
/**
 * @author lijiayin
 */
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        super.adapteeRequest();
    }
}
  1. 測試一下
/**
 * @author lijiayin
 */
public class Test {

    public static void main(String[] args) {
        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}
  1. 測試結(jié)果


    測試結(jié)果.png
  2. UML圖


    UML.png

對象適配器

  1. 修改Adapter類
/**
 * @author lijiayin
 */
public class Adapter implements Target {
    
    private Adaptee adaptee = new Adaptee();
    
    @Override
    public void request() {
        adaptee.adapteeRequest();
    }
}
  1. 測試一下


    測試結(jié)果.png
  2. UML圖


    UML.png

將220V交流電轉(zhuǎn)為5V直流電

  1. 創(chuàng)建AC220類
/**
 * @author lijiayin
 */
public class AC220 {
    public int outputAC220V(){
        int output = 220;
        System.out.println("輸出交流電" + output + "V");
        return output;
    }
}
  1. 創(chuàng)建需要實現(xiàn)的接口DC5
/**
 * @author lijiayin
 */
public interface DC5 {
    int outputDC5V();
}
  1. 創(chuàng)建適配器
/**
 * @author lijiayin
 */
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,轉(zhuǎn)為輸出DC" + adapterOutput + "V");
        return adapterOutput;
    }
}
  1. 測試一下
/**
 * @author lijiayin
 */
public class Test {
    public static void main(String[] args) {
        DC5 dc5 = new PowerAdapter();
        dc5.outputDC5V();
    }
}
  1. 測試結(jié)果


    測試結(jié)果.png

框架源碼

  1. jdk中的XmlAdapter
  2. spring下的AdvisorAdapter
  3. jpa中的JpaVendorAdapter
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容