【23種設計模式專題】 五 適配器模式

程序猿學社的GitHub,歡迎Star
github技術專題
本文已記錄到github

前言

到目前爲止,創建型模式,我們已經知道是怎麼一回事咯,從今天開始結構型模式的適配器模式相關學習。

結構型模式作用?

  • 實現鬆耦合,從而可以擴大整體類結構,用來解決更大的問題

什麼是適配器模式?

  • 將一個類的接口轉換成客戶希望的另外一個接口。解決兼容性的問題,讓原本因爲不兼容不能一起工作的兩個類可以一起工作。

工作原理

待適配的類:適配的類或者接口,定義待適配的接口
適配器:調用是適配的類,轉爲客戶期望的類,解決兼容問題
目標:客戶希望的接口或者類

場景案例

  • CAN轉USB接口
  • 三口插座轉爲二口-轉換插頭
  • usb網線轉換器(主要是針對超薄本),無網線插頭,可通過轉換器實現
  • 例如我們找工作,其實也是一個適配的過程,對照工作要求進行適配。

    隔壁老王: “社長,你這說的都是啥,說的我一臉懵逼的,能否詳細說說”
    社長: “老王,剛剛我們已經知道適配器的概念和場景,你聽着有點懵逼正常,那是因爲剛剛都是停留在理論階段,沒有跟生活更好的結合起來,爲了方便理解,我畫了一個圖”

實戰

類適配器

網線

package com.cxyxs.designmode.adapter;

/**
 * Description:網線
 * Author: 程序猿學社
 * Date:  2020/5/16 23:50
 * Modified By:
 */
public class Reticle {
    public  void Internet(){
        System.out.println("插上網線,開始網上衝浪。。。");
    }
}

USB適配接口

package com.cxyxs.designmode.adapter;

/**
 * Description:USB適配接口
 * Author: 程序猿學社
 * Date:  2020/5/17 0:22
 * Modified By:
 */
public interface Usb {
    public void conversion();
}
  • 處理上網的請求

適配器

package com.cxyxs.designmode.adapter;

/**
 * Description:適配器
 * Author: 程序猿學社
 * Date:  2020/5/16 23:55
 * Modified By:
 */
public class UsbAdapter extends Reticle implements  Usb{


    @Override
    public void conversion() {
        super.Internet();
    }
}
  • 等價於USB轉接器

電腦

package com.cxyxs.designmode.adapter;

/**
 * Description:超薄電腦
 * Author: 程序猿學社
 * Date:  2020/5/16 23:52
 * Modified By:
 */
public class UltraThinPc {
    /**
     * 網上衝浪
     * @param usb
     */
    public void surfing(Usb usb){
        usb.conversion();
    };
}

隔壁老王: “買了一臺電腦,只有USB接口,我們需要上網咋辦?”
社長: “我們需要買一個USB網線轉換器,就可以實現上網功能,所以這裏需要聚合一個USB的接口,這樣就可以實現上網功能”

測試類

package com.cxyxs.designmode.adapter;

/**
 * Description:
 * Author: 程序猿學社
 * Date:  2020/5/17 0:02
 * Modified By:
 */
public class Client {
    public static void main(String[] args) {
        UsbAdapter usb = new UsbAdapter();
        UltraThinPc ultraThinPc = new UltraThinPc();
        ultraThinPc.surfing(usb);
    }
}


社長: “說了這麼多,我們來總結一下類適配器”

類適配器缺點:

  • 類適配器(UsbAdapter)使用了單繼承(Reticle網線),會有侷限性。

隔壁老王: “既然,類適配器存在單繼承的問題,有沒有版本去改進”
社長: “有辦法的,我們可以採用對象適配器的方式”

對象適配器

對象適配器

package com.cxyxs.designmode.adapter.newclass;

import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.Usb;

/**
 * Description:適配器
 * Author: 程序猿學社
 * Date:  2020/5/16 23:55
 * Modified By:
 */
public class UsbNewAdapter  implements  Usb{
    private Reticle reticle;

    public  UsbNewAdapter(Reticle reticle) {
        this.reticle = reticle;
    }

    @Override
    public void conversion() {
        reticle.Internet();
    }
}
  • 把繼承換成聚合,解決了單繼承的問題

客戶端

package com.cxyxs.designmode.adapter.newclass;

import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.UltraThinPc;
import com.cxyxs.designmode.adapter.UsbAdapter;

/**
 * Description:
 * Author: 程序猿學社
 * Date:  2020/5/17 0:02
 * Modified By:
 */
public class NewClient {
    public static void main(String[] args) {
        //網線
        Reticle reticle = new Reticle();
        UsbNewAdapter usb = new UsbNewAdapter(reticle);
        UltraThinPc ultraThinPc = new UltraThinPc();
        ultraThinPc.surfing(usb);
    }
}


作者:程序猿學社
原創公衆號:『程序猿學社』,專注於java技術棧,分享java各個技術系列專題,以及各個技術點的面試題。
原創不易,轉載請註明來源(註明:來源於公衆號:程序猿學社, 作者:程序猿學社)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章