一、是什么
1. 定義:讓原來不兼容的兩個接口協同工作
2. 分類: 類適配器、對象適配器、接口適配器
3. 角色
- 目標接口:Target,該角色把其他類轉換為我們期望的接口
- 被適配者: Adaptee 原有的接口,也是希望被改變的接口
- 適配器: Adapter, 將被適配者和目標接口組合到一起的類
4. 類圖
對象適配器,使用組合

類適配器,在java中實現不了,需要多重繼承才能實現,類圖是這個樣子的,當然如果變通一下,Target是接口就可以了

接口適配器 抽象方法

接口適配器的使用場景: 原有接口有很多方法,而我們只需要其中一部分,這是看可以用抽象類來實現該接口,不需要的方法只需要寫個空方法(默認實現)就好了,接口目標類去實現自己需要的接口
適用的場景是不想實現原有類的所有方法
二、示例
- 背景:買了一個進口筆記本電腦
- 沖突:筆記本電腦需要的三項電源,和只提供的二項電源沖突
- 解決方案:設置一個適配器二項充電口轉化為三項充電口
2.1.1 Adaptee 原有的類 提供二項電
/** * 插頭 二項供電 Adaptee */ public class TwoPower { public void powerByTwo() { System.out.println("提供二項供電"); } }
2.1.2 Target 目標類 能輸出三項供電
/** * 插頭提供三項供電 (target) */ public interface ThreePower { /** * 三項供電 */ void powerByThree(); }
2.1.3 對象適配器,轉換類 Adapter
/** * 二項轉三項的適配器 組合的方式 對象適配器 */ public class TwoToThreeAdapter implements ThreePower{ /** * 使用委托來完成適配 */ private TwoPower twoPower; public TwoToThreeAdapter(TwoPower twoPower) { this.twoPower = twoPower; } @Override public void powerByThree() { System.out.println("借助組合適配器轉化二項電"); twoPower.powerByTwo(); } }
2.1.4 類適配器 轉換類 Adapter
/** * 二項轉三項的適配器 繼承的方式 類 */ public class TwoToThreeAdapter2 extends TwoPower implements ThreePower { @Override public void powerByThree() { System.out.println("借助繼承適配器轉化二項電"); this.powerByTwo(); } }
測試
/** * 筆記本電腦 這是使用組合模式的-適配器模式 */ public class NoteBook { /** * 期望的三項供電接口 */ private ThreePower threePower; public NoteBook(ThreePower threePower) { this.threePower = threePower; } public static void main(String[] args) { // ============================ 繼承方式的適配器使用 類適配器 ===================================== ThreePower threePower1 = new TwoToThreeAdapter2(); NoteBook noteBook1 = new NoteBook(threePower1); noteBook1.recharge(); noteBook1.work(); // ============================ 組合方式的適配器使用 對象適配器 ===================================== // 現在只有二項供電 TwoPower twoPower = new TwoPower(); ThreePower threePower = new TwoToThreeAdapter(twoPower); NoteBook noteBook = new NoteBook(threePower); // 1. 充電 noteBook.recharge(); // 2. 工作 noteBook.work(); } public void work() { System.out.println("筆記本電腦開始工作!"); } public void recharge() { // 使用三項充電 threePower.powerByThree(); } }
控制台顯示:
提供二項供電
借助繼承適配器轉化二項電
筆記本電腦開始工作!
提供二項供電
借助組合適配器轉化二項電
筆記本電腦開始工作!
三、總結
適配器好處
- 重用
- 復用的現存的類, 解決了現存類和復用環境要不一致的問題
- 低耦合
- 無需修改原有代碼(遵循開閉原則)
這里說些缺點吧,過多的使用適配器,的確會讓程序看起來很難懂,我的理解是,在適配別人接口和其他API接口時,適配器的用處就來了

