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

Java 設計模式精講:適配器模式(Adapter Pattern)

     編輯:Java 相關知識

模式定義與核心角色

適配器模式屬於結構型模式,目的在於將兩個介面不相容的類別協同工作。核心角色:

  • Target(目標介面):客戶端期望的介面
  • Adaptee(被適配者):現有、介面不相容的類別
  • Adapter(適配器):實作 Target,內部委派 Adaptee,完成介面轉換

兩種實作風格

1. 物件適配器(組合)—— 推薦

// 目標介面
public interface SquarePeg {
    void insert(String str);
}

// 被適配者(無法修改)
public class RoundPeg {
    public void insertIntoHole(String msg) {
        System.out.println("RoundPeg: " + msg);
    }
}

// 適配器:實作 Target,持有 Adaptee 實例
public class PegAdapter implements SquarePeg {
    private final RoundPeg roundPeg;

    public PegAdapter(RoundPeg peg) { this.roundPeg = peg; }

    @Override
    public void insert(String str) {
        roundPeg.insertIntoHole(str); // 委派並轉換介面
    }
}

優點:單一職責、可適配 Adaptee 所有子類、符合「組合優於繼承」原則。

2. 類別適配器(繼承)—— 受限於單一繼承

public class PegAdapter extends RoundPeg implements SquarePeg {
    @Override
    public void insert(String str) {
        super.insertIntoHole(str); // 直接呼叫父類方法
    }
}

缺點:Java 不支援多重繼承,無法同時適配多個 Adaptee;與 Adaptee 耦合度高。

進階變體

雙向適配器

實作兩個目標介面,可在兩種脈絡下互相轉換:

public interface RoundPeg { void insertIntoHole(String msg); }
public interface SquarePeg { void insert(String str); }

public class TwoWayAdapter implements RoundPeg, SquarePeg {
    private final RoundPeg round;
    private final SquarePeg square;

    public TwoWayAdapter(RoundPeg r) { this.round = r; }
    public TwoWayAdapter(SquarePeg s) { this.square = s; }

    @Override public void insertIntoHole(String msg) { square.insert(msg); }
    @Override public void insert(String str) { round.insertIntoHole(str); }
}

可插拔適配器

搭配反射(Reflection)在執行期動態發現並載入適配器,適用於外掛架構。

實務應用場景

  • 第三方庫介面與自有領域模型不匹配
  • 舊系統遷移:新介面包裝舊實作
  • 資料庫驅動程式(JDBC Driver 即適配器)
  • 集合框架:Collections.list(Enumeration)、Arrays.asList()

設計原則檢核

原則適配器模式體現
開放封閉原則 (OCP)新增適配器不修改既有 Adaptee/Client
單一職責原則 (SRP)介面轉換邏輯集中在 Adapter
依賴倒置原則 (DIP)Client 依賴 Target 抽象,非具體 Adaptee
里氏替換原則 (LSP)Adapter 可透明替換 Target 實作

常見誤區與避坑

  1. 過度設計:介面本身相容時,無需強行引入適配器。
  2. 混淆裝飾器:裝飾器增強功能且介面相同;適配器轉換介面。
  3. 忽略異常轉換:Adaptee 拋出的檢查型異常需包裝為 Target 定義的異常。

總結

適配器模式是「介面不兼容」的標準解法。實務上優先選擇物件適配器(組合),搭配介面導向設計,即可在不修改既有程式碼前提下,讓舊資產無縫接入新架構。

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