天天看點

設計模式七:用一個USB轉換器的例子說清楚擴充卡模式

文章目錄

  • ​​一、 背景​​
  • ​​二、 USB擴充卡​​
  • ​​三、總結​​

設計模式一:

​​《用一個營銷政策的執行個體說清楚政策模式的應用場景》​​

設計模式二:

​​《用一個股票買賣的例子說清楚觀察者模式》​​

設計模式三:

​​《用一個蘇式面條的執行個體說清楚裝飾者模式》​​

設計模式四:

​​《用一個生産手機的簡單例子說清楚工廠模式》​​

設計模式五:

​​《用不同的實作方式建立單例模式》​​

設計模式六:

​​《用一個遙控開關的例子說清楚指令模式》​​

一、 背景

  • 擴充卡模式是一個比較好了解的設計模式:其核心思想就是建立一個擴充卡對象(考慮到JAVA沒有多重繼承的特性,我們這裡隻介紹對象擴充卡),把一個接口轉換成另外一個接口,使得原本由于接口不相容的對象能一起工作。
  • 我們舉實際生活中的一個USB轉換器(Apple USB-C 至 USB 轉換器)的例子來說明

二、 USB擴充卡

  • 在MacBook上已經擁有了一個USB-C接口
  • 設計模式七:用一個USB轉換器的例子說清楚擴充卡模式
/**
 * MacBook USB-C接口
 */
public interface USB_C {

    // 該接口可以直接連接配接USB-C裝置
    void connect();
}      
  • 我們手上有個USB-A的裝置,希望能連接配接到MacBook上
  • 設計模式七:用一個USB轉換器的例子說清楚擴充卡模式
/**
 * USB-A
 */
public interface USB_A {

    void connect();
}

/**
 * USB-A裝置
 */
public class USB_A_Connection implements USB_A {
    @Override
    public void connect() {
        System.out.println("USB-A裝置進行連接配接");
    }
}      
  • 這時候我們需要借用一個USB擴充卡,把USB-A轉成USB-C的接口,讓MacBook可以連上USB-A裝置
  • 設計模式七:用一個USB轉換器的例子說清楚擴充卡模式
/**
 * USB-C轉USB-A擴充卡
 */
public class USBAdapter  implements USB_C {

    private USB_A usbA;

    public USBAdapter(USB_A usbA) {
        this.usbA = usbA;
    }

    @Override
    public void connect(){
        System.out.println("插入USB-C轉USB-A擴充卡");
        usbA.connect();
    }

}      
  • 最後,我們把U盤插到USB擴充卡上完成連接配接
/**
 * 把USB-A裝置插入擴充卡
 */
public class Main {

    public static void main(String[] args) {

        // U盤
        USB_A usbA = new USB_A_Connection();
        // 插上擴充卡
        USBAdapter usbAdapter = new USBAdapter(usbA);
        // U盤與擴充卡連接配接
        usbAdapter.connect();

    }
}      

三、總結

  • 讓我們回顧一下以上轉換器例子的UML圖
  1. USB_C稱為目标接口
  2. USB_A_Connection稱為被适配者或源接口角色
  3. USBAdapter就是擴充卡,它的作用就是将被适配者的源接口轉化為目标接口
  • 主要優點:

    使用擴充卡模式,程式員不需要修改原有代碼而實作重用。

  • 主要缺點:

    過多使用擴充卡會導緻系統淩亂,且實作過程比較複雜。