目錄
- 一、 啥是適配器模式?
- 二、 為什么要用適配器模式?
- 三、 適配器模式的實現方式
- 1. 類適配器模式(繼承插座 👨?👩?👧?👦)
- 2. 對象適配器模式(插座轉換器 🔌)
- 3. 接口適配器模式(萬能插座 🗜?)
- 四、 三種適配器的對比
- 五、 適配器模式的優缺點
- 六、 適配器模式的應用場景
- 七、 總結
🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解代理模式請看: (六)趣學設計模式 之 代理模式!
這篇文章帶你詳細認識一下設計模式中的適配器模式
一、 啥是適配器模式?
想象一下,你買了一個新的電器 💡,但是插頭和家里的插座不匹配 😫,怎么辦? 這時候就需要一個插座轉換器 🔌,把電器的插頭轉換成家里的插座可以使用的類型 💡。
適配器模式,就是用來解決接口不兼容的問題! 它可以將一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作 🤝。
簡單來說,就是把不兼容的接口轉換成兼容的接口!
- 你想使用一個類,但是它的接口和你需要的接口不一樣: 就像你想用一個舊的類庫,但是它的接口和你的代碼不兼容 😫!
- 你想讓兩個接口不兼容的類一起工作: 就像你想讓一個美國的插頭和一個中國的插座一起工作 🔌!
- 你想重用一些現有的類,但是它們的接口不符合你的要求: 就像你想用一個舊的算法,但是它的輸入輸出格式和你的代碼不兼容 😫!
二、 為什么要用適配器模式?
用適配器模式,好處多多 👍:
- 提高類的復用性: 可以將一些現有的類適配成新的接口,方便重用 ??!
- 提高系統的靈活性: 可以動態地選擇不同的適配器,使得系統更加靈活 🤸!
- 符合開閉原則: 可以在不修改現有代碼的情況下,增加新的適配器,擴展功能 🆕!
- 解耦: 將客戶端和目標類解耦,降低系統的耦合度 🔗!
三、 適配器模式的實現方式
適配器模式主要分為三種:
- 類適配器模式: 通過繼承來實現適配,就像繼承了插座的類 👨?👩?👧?👦!
- 對象適配器模式: 通過組合來實現適配,就像用一個插座轉換器 🔌!
- 接口適配器模式: 通過實現一個抽象類來實現適配,就像萬能插座 🗜?!
1. 類適配器模式(繼承插座 👨?👩?👧?👦)
類適配器模式,通過繼承來實現適配,就像繼承了插座的類,擁有了插座的功能 🔌!
案例:電壓適配器(經典案例 ?)
假設你有一個 220V 的電源 🔌,但是你需要給一個 5V 的設備充電 📱,怎么辦? 這時候就需要一個電壓適配器,把 220V 的電壓轉換成 5V 的電壓 ?!
代碼示例:
// 目標接口:5V 電壓
public interface Voltage5V {int output5V(); // 輸出 5V 電壓
}// 需要適配的類:220V 電壓
public class Voltage220V {public int output220V() {int src = 220;System.out.println("我是220V電壓");return src;}
}// 適配器類:電壓適配器
public class VoltageAdapter extends Voltage220V implements Voltage5V {@Overridepublic int output5V() {// 獲取 220V 電壓int srcV = output220V();// 轉換成 5V 電壓int dstV = srcV / 44;return dstV;}
}// 客戶端
public class Client {public static void main(String[] args) {VoltageAdapter adapter = new VoltageAdapter(); // 創建適配器對象int voltage = adapter.output5V(); // 獲取 5V 電壓System.out.println("輸出電壓為:" + voltage + "V"); // 輸出電壓}
}
分析:
Voltage5V
是目標接口,客戶端需要使用 5V 電壓。Voltage220V
是需要適配的類,它只能輸出 220V 電壓。VoltageAdapter
是適配器類,它繼承了Voltage220V
類,并實現了Voltage5V
接口,將 220V 電壓轉換成 5V 電壓。
輸出結果:
我是220V電壓
輸出電壓為:5V
2. 對象適配器模式(插座轉換器 🔌)
對象適配器模式,通過組合來實現適配,就像用一個插座轉換器,把電器的插頭轉換成家里的插座可以使用的類型 🔌!
案例:還是電壓適配器(對象版?)
還是上面的電壓適配器的例子,但是這次我們使用對象適配器模式來實現 🚀!
代碼示例:
// 目標接口:5V 電壓
public interface Voltage5V {int output5V(); // 輸出 5V 電壓
}// 需要適配的類:220V 電壓
public class Voltage220V {public int output220V() {int src = 220;System.out.println("我是220V電壓");return src;}
}// 適配器類:電壓適配器
public class VoltageAdapter implements Voltage5V {private Voltage220V voltage220V; // 組合 220V 電壓對象public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {// 獲取 220V 電壓int srcV = voltage220V.output220V();// 轉換成 5V 電壓int dstV = srcV / 44;return dstV;}
}// 客戶端
public class Client {public static void main(String[] args) {Voltage220V voltage220V = new Voltage220V(); // 創建 220V 電壓對象VoltageAdapter adapter = new VoltageAdapter(voltage220V); // 創建適配器對象int voltage = adapter.output5V(); // 獲取 5V 電壓System.out.println("輸出電壓為:" + voltage + "V"); // 輸出電壓}
}
分析:
Voltage5V
是目標接口,客戶端需要使用 5V 電壓。Voltage220V
是需要適配的類,它只能輸出 220V 電壓。VoltageAdapter
是適配器類,它組合了Voltage220V
類,并實現了Voltage5V
接口,將 220V 電壓轉換成 5V 電壓。
輸出結果:
我是220V電壓
輸出電壓為:5V
3. 接口適配器模式(萬能插座 🗜?)
接口適配器模式,通過實現一個抽象類來實現適配,就像萬能插座,可以兼容各種類型的插頭 🗜?!
案例:USB 接口適配器(萬能接口 💻)
假設你有一個 USB 設備 💾,但是你的電腦只有 Type-C 接口 💻,怎么辦? 這時候就需要一個 USB 接口適配器,把 USB 接口轉換成 Type-C 接口 💻!
代碼示例:
// 目標接口:USB 接口
public interface Usb {void read(); // 讀取數據void write(); // 寫入數據void connect(); // 連接設備void disconnect(); // 斷開連接
}// 抽象適配器類:USB 適配器
public abstract class UsbAdapter implements Usb {@Overridepublic void read() {// 默認實現,可以不實現}@Overridepublic void write() {// 默認實現,可以不實現}@Overridepublic void connect() {// 默認實現,可以不實現}@Overridepublic void disconnect() {// 默認實現,可以不實現}
}// 需要適配的類:Type-C 設備
public class TypeCDevice extends UsbAdapter {@Overridepublic void read() {System.out.println("Type-C 設備讀取數據");}@Overridepublic void write() {System.out.println("Type-C 設備寫入數據");}
}// 客戶端
public class Client {public static void main(String[] args) {TypeCDevice typeCDevice = new TypeCDevice(); // 創建 Type-C 設備對象typeCDevice.connect(); // 連接設備typeCDevice.read(); // 讀取數據typeCDevice.write(); // 寫入數據typeCDevice.disconnect(); // 斷開連接}
}
分析:
Usb
是目標接口,客戶端需要使用 USB 接口。UsbAdapter
是抽象適配器類,它實現了Usb
接口,但是提供了默認實現,子類可以選擇性地實現需要的方法。TypeCDevice
是需要適配的類,它繼承了UsbAdapter
類,并實現了read
和write
方法,實現了 USB 接口的功能。
輸出結果:
Type-C 設備讀取數據
Type-C 設備寫入數據
四、 三種適配器的對比
特性 | 類適配器模式 | 對象適配器模式 | 接口適配器模式 |
---|---|---|---|
實現方式 | 繼承 | 組合 | 抽象類 |
優點 | 簡單易用 | 靈活,可以適配多個類 | 可以選擇性地實現接口方法 |
缺點 | 只能適配一個類,耦合度較高 | 需要持有目標類的對象,增加了對象的數量 | 需要定義抽象類,增加了類的數量 |
適用場景 | 目標類接口比較穩定,不需要經常修改 | 需要適配多個類,或者目標類接口經常修改 | 只需要使用接口中的部分方法 |
五、 適配器模式的優缺點
優點:
- 提高類的復用性 ??!
- 提高系統的靈活性 🤸!
- 符合開閉原則 🆕!
- 解耦 🔗!
缺點:
- 增加了系統的復雜度 😫!
- 可能會降低性能 🐌!
六、 適配器模式的應用場景
- 接口轉換: 將一個類的接口轉換成客戶希望的另外一個接口 🔌!
- 數據轉換: 將一種格式的數據轉換成另外一種格式的數據 🗂?!
- 遺留系統集成: 將新的系統和舊的系統集成在一起 🤝!
- 第三方庫集成: 將第三方庫集成到你的項目中 📚!
七、 總結
- 適配器模式就像插座轉換器,讓不兼容的接口也能愉快玩耍! 🔌
- 主要分為類適配器模式、對象適配器模式和接口適配器模式三種! 🤸
- 優點是提高類的復用性、提高系統的靈活性、符合開閉原則、解耦! 👍
- 缺點是增加復雜度、可能降低性能! 👎
- 適用于需要解決接口不兼容的問題的場景! 🎯
希望這篇文章能讓你徹底理解適配器模式! 💯 祝你學習愉快! 😄
看完請看:(八)趣學設計模式 之 裝飾器模式!