初識設計模式 - 適配器模式

適配器在生活中經常見到,如手機、筆記型電腦電腦的電源適配器,USB 轉接頭都是常見的適配器。

在設計模式當中,適配器模式既可以作為類結構型模式,也可以作為對象結構型模式。

在類適配器模式中,適配器與適配者之間是繼承(實現)關係;在對象適配器模式中,適配器與適配者之間是關聯關係。

具體實現

類適配器模式

典型的類適配器模式程式碼示例如下:

class Adapter extends Adaptee implements Target {
    public void request() {
        // 轉發調用
        super.specificRequest();
    }
}

從上述的程式碼可以看出,典型的類適配器模式就是通過繼承的方式,使用子類方法調用父類的方法,使用者在使用時面對的是適配器類而不是原始類。

對象適配器模式

典型的對象適配器模式程式碼示例如下:

class Adapter extends Target {
    // 維持一個對適配者的引用
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        // 轉發調用
        adaptee.specificRequest();
    }
}

代理、橋接、裝飾器、適配器的區別

籠統地說,這 4 種設計模式可以稱為 Wrapper 模式,也就是通過 Wrapper 類二次封裝原始類。

儘管它們的程式碼結構類似,但這 4 種設計模式的用意完全不同,以下是它們簡要描述:

  • 代理模式:代理類在不改變原始類介面的條件下,為原始類定義一個代理類,主要目的是控制訪問,而非加強功能,這是它與裝飾器模式最大的不同
  • 橋接模式:橋接模式的目的是將介面部分和實現部分分離,從而讓它們可以較為容易、也相對獨立地加以改變
  • 裝飾器模式:裝飾器模式在不改變原始類介面的情況下,對原始類功能進行加強,並且支援多個裝飾器的嵌套使用
  • 適配器模式:適配器提供跟原始類不同的介面,而代理模式、裝飾器模式提供的都是跟原始類相同的介面,適配器模式是一種事後的補救策略

總結

優點

適配器模式的主要優點如下:

  • 將目標類和適配者類解耦
  • 增加了類的透明性和復用性
  • 靈活性和擴展性都非常好

除上述以外,對象適配器模式還有以下優點:

  • 一個對象適配器可以把多個不同的適配器適配到同一個目標
  • 可以適配一個適配者的子類

缺點

類適配器模式的主要缺點如下:

  • 對於不支援多重繼承的程式語言,一次最多只能適配一個適配者類,不能同時適配多個適配者
  • 適配者類必須是可被繼承的
  • 對於不支援多重繼承的程式語言,類適配器模式中的目標抽象類只能為介面,不能為類,其使用有一定的局限性

對象適配器模式的主要缺點如下:

  • 與類適配器模式相比,要在適配器中置換適配者類的某些方法比較麻煩

適用場景

適配器模式的適用場景如下:

  • 封裝有缺陷的介面設計
  • 統一多個類的介面設計
  • 替換依賴的介面設計
  • 兼容老版本介面
  • 適配不同格式的數據

源碼

在 Java 中,SLF4J 日誌框架不僅僅提供了統一的介面定義,還提供了針對不同日誌框架的適配器。對不同日誌框架的介面進行二次封裝,適配成統一的 SLF4J 介面定義。