Android 設計模式 - 介面卡模式
1. 定義
將一個介面轉換成客戶希望的另一個介面,使介面不相容的類可以一起工作,其別名為包裝器。介面卡模式既可以作為類結構型模式,也可以作為物件結構型模式。
介面卡模式分為類介面卡模式和物件介面卡模式,由於Java 不支援多重繼承,提倡多用組合少用繼承,所以本文主要介紹物件介面卡。
2. 作用
簡言之就是介面轉換,比如日常生活中,iPhone 使用 Lightning 介面充電,Android 手機使用 MicroUsb 介面。如果我們想用帶 MicroUsb 介面的線給 iPhone 充電怎麼辦?自然是找個轉接頭,讓電流從 MicroUsb 介面流向 Lightning 介面。這樣,轉接頭就是個介面卡,讓本來不能一起使用的 MicroUsb 介面和 iPhone 可以友好相處啦。
3. 結構
介面卡模式包含如下角色:
- Target:目標抽象類
- Adapter:介面卡類
- Adaptee:適配者類
- Client:客戶類
4. 實現

類圖
-
目標抽象類,就是 iPhone 要使用的 Lightning 介面。
public interface ILightningInterface { /** * 充電 */ void charge(); }
-
介面卡類,轉接頭把 MicroUsb 介面轉換為 Lightning 介面。
public class InterfaceAdapter implements ILightningInterface { private MicroUsbInterface microUsbInterface; public InterfaceAdapter(MicroUsbInterface microUsbInterface) { this.microUsbInterface = microUsbInterface; } @Override public void charge() { microUsbInterface.charge(); } }
-
適配者類,要適配的 MicroUsb 介面。
public class MicroUsbInterface { public void charge() { System.out.println("charge with MicroUsb"); } }
-
客戶類,有了轉接頭,iPhone 也可以使用 MicroUsb 線充電啦。
public class AdapterTest { public static void main(String[] args) { // 直接使用 Lightning 充電口 ILightningInterface lightningInterface = new LightningInterface(); lightningInterface.charge(); // 使用轉接頭把 MicroUsb 介面轉換為 Lightning 介面 MicroUsbInterface microUsbInterface = new MicroUsbInterface(); ILightningInterface interfaceAdapter = new InterfaceAdapter(microUsbInterface); interfaceAdapter.charge(); } }
5. 優缺點
1. 優點:
- 將目標類和適配者類解耦,增加了類的透明性和複用性;
- 系統的靈活性和擴充套件性都非常好,更換介面卡或者增加新的介面卡都非常方便,符合「開閉原則」。
2. 缺點:
過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是 A 介面,其實內部被適配成了 B 介面的實現,一個系統如果太多出現這種情況,無異於一場災難。
3. 使用場景:
- 系統需要使用現有的類,而這些類的介面不符合系統的需要;
- 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的類一起工作。
【附錄】

資料圖