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

Java 結構型設計模式:適配器模式與橋接模式深度解析

     編輯:Java 相關知識

適配器模式

定義與用途

適配器模式 將一個類的介面轉換成客戶端期望的另一個介面,讓原本介面不相容的類別能夠合作。又稱「包裝器模式」。

兩種實作形式

  1. 物件適配器(推薦):透過組合關係持有被適配者實例,實作目標介面。降低耦合,符合「合成復用原則」。
  2. 類別適配器:透過多重繼承同時繼承目標介面與被適配者。Java 不支援多重繼承,故較少使用。

角色結構

  • Target:客戶端期望的介面
  • Adaptee:已存在、介面不相容的類別
  • Adapter:實作 Target,內部委派 Adaptee
  • Client:使用 Target 介面

程式碼範例(物件適配器)

// 被適配者:既有介面
class Adaptee {
    public void specificRequest() {
        System.out.println("Hello, I am from Adaptee!");
    }
}

// 目標介面:客戶端期望
interface Target {
    void request();
}

// 適配器:實作 Target,委派 Adaptee
class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客戶端
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();  // 輸出: Hello, I am from Adaptee!
    }
}

適用場景

  • 想使用既有類別,但其介面不符合需求
  • 建立可復用類別,需與未來未知的不相關類別協作
  • 第三方庫介面與自有系統介面不一致時的中介層

橋接模式

核心動機

當抽象化與實作化都可能獨立變化時,橋接模式將兩者解耦,使其能各自擴充而不互相影響。避免繼承爆炸(如:形狀 × 繪圖 API = 組合爆炸)。

角色結構

  • Abstraction:抽象化角色,定義高層介面,持有 Implementor 參考
  • RefinedAbstraction:修正抽象化,擴充高層邏輯
  • Implementor:實作化介面,定義底層操作原語
  • ConcreteImplementor:具體實作化類別

程式碼範例

// 實作化介面
interface DrawingAPI {
    void drawCircle(double x, double y, double radius);
}

// 具體實作化 1
class DrawingAPI1 implements DrawingAPI {
    public void drawCircle(double x, double y, double radius) {
        System.out.printf("API1.circle at %f:%f radius %f%n", x, y, radius);
    }
}

// 具體實作化 2
class DrawingAPI2 implements DrawingAPI {
    public void drawCircle(double x, double y, double radius) {
        System.out.printf("API2.circle at %f:%f radius %f%n", x, y, radius);
    }
}

// 抽象化角色
interface Shape {
    void draw();                    // 低層:委派實作化
    void resizeByPercentage(double pct); // 高層:抽象化特有邏輯
}

// 修正抽象化
class CircleShape implements Shape {
    private double x, y, radius;
    private DrawingAPI drawingAPI;

    public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
        this.x = x; this.y = y; this.radius = radius; this.drawingAPI = drawingAPI;
    }

    @Override
    public void draw() {
        drawingAPI.drawCircle(x, y, radius); // 委派實作化
    }

    @Override
    public void resizeByPercentage(double pct) {
        radius *= pct; // 抽象化層邏輯
    }
}

// 客戶端
public class BridgeDemo {
    public static void main(String[] args) {
        Shape[] shapes = {
            new CircleShape(1, 2, 3, new DrawingAPI1()),
            new CircleShape(5, 7, 11, new DrawingAPI2())
        };
        for (Shape s : shapes) {
            s.resizeByPercentage(2.5);
            s.draw();
        }
    }
}

適用場景

  • 不想在抽象化與實作化之間建立固定綁定,需在執行時切換實作
  • 抽象化與實作化都需獨立擴充(如:多種形狀 × 多種繪圖引擎)
  • 資料持久化策略切換(檔案 / 資料庫 / 雲端)

兩者關鍵差異比較

維度適配器模式橋接模式
意圖事後補救:讓不相容介面能合作事先規劃:分離抽象與實作,支援獨立演化
關係適配器「包裝」被適配者抽象化「持有」實作化參考
耦合度降低客戶端與被適配者耦合降低抽象化與實作化耦合
典型場景整合第三方庫、舊系統遷移跨平台 GUI、驅動程式架構、策略切換

結語

適配器模式解決「介面不匹配」的整合問題;橋接模式解決「多維度變化」的架構問題。實務中常搭配使用:橋接定義架構骨幹,適配器處理外部系統接入。掌握兩者精髓,能顯著提升系統的擴充性與維護性。

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