首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 設計模式精講:適配器模式(類適配器 vs 對象適配器)

     編輯:Java 綜合教學

Java 設計模式精講:適配器模式(類適配器 vs 對象適配器)

適配器模式將一個類的接口轉換為客戶端期望的另一個接口,使原本不兼容的類能夠協同工作。生活中常見的「變壓器」(220V 轉 110V)即是典型適配器。本文對比類適配器與對象適配器兩種形式,並結合 Android Adapter、JDBC 驅動等實戰場景深度解析。

模式結構對比

維度類適配器對象適配器
實現方式繼承 Adaptee,實現 Target組合 Adaptee 實例,實現 Target
耦合度高(繼承為白箱復用)低(組合為黑箱復用)
靈活性只能適配具體 Adaptee 及其子類可適配 Adaptee 及其所有子類
覆寫行為可覆寫 Adaptee 方法難以覆寫 Adaptee 方法
Java 適用性受單繼承限制,較少用首選形式,符合組合優於繼承原則

類適配器 UML 與代碼

類適配器 UML

// 目標接口:客戶端期望的接口
public interface Target {
    void request();
}

// 被適配者:現有不兼容接口
public class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee 特有功能");
    }
}

// 類適配器:繼承 Adaptee + 實現 Target
public class ClassAdapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest(); // 直接復用父類方法
    }
}

// 客戶端調用
public class Client {
    public static void main(String[] args) {
        Target target = new ClassAdapter();
        target.request(); // 輸出:Adaptee 特有功能
    }
}

對象適配器 UML 與代碼(推薦)

// 對象適配器:持有 Adaptee 引用
public class ObjectAdapter implements Target {
    private Adaptee adaptee; // 組合

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest(); // 委託調用
    }
}

// 客戶端:可動態切換不同 Adaptee 實現
public class Client {
    public static void main(String[] args) {
        Target adapter1 = new ObjectAdapter(new Adaptee());
        Target adapter2 = new ObjectAdapter(new SubAdaptee()); // 適配子類
        adapter1.request();
        adapter2.request();
    }
}

實戰場景深度解析

1. Android ListView/RecyclerView Adapter

本質:將數據源(List<T>、Cursor、數組)適配為 View 列表。
BaseAdapter 實現 ListAdapter 接口(Target),內部持有數據集合(Adaptee),getView() 將數據項轉換為 View。
對象適配器優勢:同一 Adapter 類可適配 ArrayList、LinkedList、Cursor 等任意數據源,只需傳入不同實例。

2. JDBC 驅動:DriverManager 適配各廠商 Driver

// Target: java.sql.Driver 接口
// Adaptee: com.mysql.jdbc.Driver、oracle.jdbc.OracleDriver 等
// 適配器: DriverManager 內部註冊表
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // 適配 MySQL
Connection conn = DriverManager.getConnection(url, user, pwd); // 統一獲取連接

各廠商實現 java.sql.Driver(Target),DriverManager 作為適配器管理註冊表,屏蔽具體驅動差異。

3. Java IO 流適配:InputStreamReader

// Adaptee: FileInputStream(字節流)
// Target: Reader(字符流)
// 適配器: InputStreamReader
Reader reader = new InputStreamReader(new FileInputStream("data.txt"), "UTF-8");
reader.read(charBuffer); // 直接按字符讀取,自動處理解碼

裝飾器模式與適配器模式結合:InputStreamReader 適配字節流為字符流,BufferedReader 再裝飾增加緩衝。

4. Spring MVC HandlerAdapter

DispatcherServlet 調用 HandlerAdapter.handle() 統一處理 Controller、HttpRequestHandler、Servlet 等不同類型 Handler,屏蔽底層差異。

模式選型決策樹

  1. 需適配的 Adaptee 是最終類(final)或介面? → 只能用對象適配器
  2. 需覆寫 Adaptee 部分行為? → 類適配器(但 Java 單繼承限制大)
  3. 需動態切換多種 Adaptee 實現? → 對象適配器
  4. 項目規範推薦組合優於繼承? → 對象適配器

常見誤區

  • 混淆裝飾器與適配器:裝飾器增強職能(同接口),適配器轉換接口(異接口)
  • 濫用類適配器:Java 單繼承導致類適配器擴展性極差,90%+ 場景首選對象適配器
  • 忽略雙向適配:若雙向轉換頻繁,考慮雙向適配器或統一中間表示層

總結

適配器模式是「兼容舊系統、整合第三方庫、屏蔽底層差異」的利器。對象適配器憑藉低耦合、高靈活、符合組合復用原則,成為 Java 開發首選。理解其與裝飾器、代理、外觀模式的邊界,能讓架構決策更精準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved