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

Java 橋接模式深度解析:將抽象與實現解耦的經典實戰

     編輯:Java 相關知識

模式動機:多維度變化的噩夢

電腦銷售系統:

  • 類型維度:筆記本、台式機、平板
  • 品牌維度:聯想、戴爾、華碩、神舟

若用繼承:LenovoLaptop、DellLaptop、LenovoDesktop、DellDesktop... 類爆炸,新增類型/品牌都要成對增加類。

橋接模式核心思想

將抽象部分與實現部分分離,使它們都可以獨立變化。

  • 抽象化:高層控制邏輯(如「銷售電腦」),持有對實現的引用
  • 實現化:底層具體操作(如「聯想品牌銷售」),定義接口
  • 橋接:抽象類通過組合持有實現接口,雙向獨立擴展

代碼實戰:電腦銷售系統

// 1. 實現化接口:品牌銷售行為
interface Brand {
    void Sale();
}

class Lenovo implements Brand {
    public void Sale() => System.out.println("銷售聯想品牌電腦");
}

class Dell implements Brand {
    public void Sale() => System.out.println("銷售戴爾品牌電腦");
}

// 2. 抽象化類:電腦類型(持有 Brand 引用)
abstract class Computer {
    protected Brand brand;
    public Computer(Brand brand) { this.brand = brand; }
    public abstract void Sale(); // 模板方法
}

// 3. 細化抽象:具體電腦類型
class Laptop extends Computer {
    public Laptop(Brand brand) { super(brand); }
    @Override public void Sale() {
        brand.Sale(); // 委派品牌行為
        System.out.println("類型:筆記本電腦");
    }
}

class Desktop extends Computer {
    public Desktop(Brand brand) { super(brand); }
    @Override public void Sale() {
        brand.Sale();
        System.out.println("類型:台式電腦");
    }
}

class Pad extends Computer {
    public Pad(Brand brand) { super(brand); }
    @Override public void Sale() {
        brand.Sale();
        System.out.println("類型:平板電腦");
    }
}

// 4. 客戶端:任意組合
public class BridgeDemo {
    public static void main(String[] args) {
        // 聯想筆記本
        Computer c1 = new Laptop(new Lenovo());
        c1.Sale();
        // 戴爾台式機
        Computer c2 = new Desktop(new Dell());
        c2.Sale();
        // 新增華碩平板 —— 零修改現有代碼
        Computer c3 = new Pad(new Asus()); // 僅需新增 Asus implements Brand
        c3.Sale();
    }
}

UML 結構速記

Abstraction (Computer)
    │
    ├─ RefinedAbstraction (Laptop, Desktop, Pad)
    │
    ◇── Implementor (Brand)
           │
           ├─ ConcreteImplementorA (Lenovo)
           └─ ConcreteImplementorB (Dell)

橋接 vs 策略 vs 組合

模式核心意圖關係
橋接抽象與實現雙維度獨立擴展抽象「持有」實現,構造時注入
策略算法族封裝,運行時可熱插拔Context 持有 Strategy,可隨時 setStrategy
組合部分-整體樹形結構Component 統一接口,Leaf/Composite 遞歸

實戰應用場景

  1. JDBC 驅動:Connection (抽象) + MySQL/Oracle/PostgreSQL Driver (實現)
  2. 日誌框架:Logger (抽象) + Log4j/Logback/JUL (實現) —— SLF4J 即橋接
  3. 跨平台 GUI:Window/Button (抽象) + Windows/Mac/Linux 實現
  4. 消息發送:Notification (抽象:郵件/短信/推送) + Provider (實現:阿里云/騰訊云/個推)

優缺點總結

優點缺點
抽象與實現完全解耦增加系統理解難度,需識別兩個變化維度
符合開閉原則,擴展極其靈活適用場景較窄,僅適合「雙維度正交變化」
組合優於繼承,避免類爆炸過度使用會導致代碼過度抽象

總結

橋接模式是「組合優於繼承」原則的教科書級應用。當你發現系統存在兩個獨立變化的維度(如類型/品牌、協議/平台、前端/後端),且它們的組合排列組合導致類數量爆炸時,橋接模式就是最佳解藥。

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