這篇文章講的是適配器模式,適配器模式其實在我們日常生活中就有許許多多的例子
例如插座轉接頭
這里寫圖片描述
車載充電器
這里寫圖片描述
還有許許多多其他的,我就不一一介紹了。其實設計模式中和真實世界中的適配器的作用都是一樣的,都是講一個結構轉換成另一個接口,以達到我們希望的結果。
介紹
適配器模式(Adapter Pattern## 標題 ##)是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬于結構型模式,它結合了兩個獨立接口的功能。適配器模式將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
適配器模式有兩種類型:類適配器模式和對象適配器模式。因為類適配器需要通過多重繼承進行適配,而JAVA又不支持多重繼承,所以這里主要講對象適配器,簡單介紹類適配器。
結構圖
對象適配器
這里寫圖片描述
類適配器
這里寫圖片描述
時序圖
這里寫圖片描述
案例
這里就用插座轉接頭做案例。
當插座上只有一個三孔插座,而我們的手機充電器是兩孔的,這時該怎么辦你?這時候我們就需要用一個兩孔插座轉三孔插座的適配器來適配了。如下圖
圖片來源于Head First 設計模式
充電器類
public class Charger{
public void request(){
System.out.println("我是兩孔插座的充電器!");
}
}
插座接口
public interface Adaptee {
void transaledRequest();
}
三孔插座類
public class ThreeAdaptee implements Adaptee{
public void transaledRequest(){
System.out.println("插入三孔插座!");
}
}
適配器類
public class Adapter extends Charger {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
@Override
public void request() {
super.request();
System.out.println("兩孔轉三孔!");
adaptee.transaledRequest();
}
}
測試類
public class Client {
public static void main(String[] args) {
ThreeAdaptee adaptee = new ThreeAdaptee();
Adapter adapter = new Adapter(adaptee);
adapter.request();
}
}
測試結果
這里寫圖片描述
代碼見Github地址
總結
--
適配器模式的主要優點是將目標類和適配者類解耦,增加了類的透明性和復用性,同時系統的靈活性和擴展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開閉原則”;類適配器模式的缺點是適配器類在很多編程語言中不能同時適配多個適配者類,對象適配器模式的缺點是很難置換適配者類的方法。
在類適配器模式中,適配器類實現了目標抽象類接口并繼承了適配者類,并在目標抽象類的實現方法中調用所繼承的適配者類的方法;在對象適配器模式中,適配器類繼承了目標抽象類并定義了一個適配者類的對象實例,在所繼承的目標抽象類方法中調用適配者類的相應業務方法。