適配器設計模式(Adapter Design Pattern)可以將不相容的介面轉換為可相容的介面,讓原本由於介面不相容而不能一起工作的類可以一起工作。 ...
適配器在生活中經常見到,如手機、筆記本電腦的電源適配器,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 介面定義。