電腦銷售系統:
若用繼承: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();
}
}
Abstraction (Computer)
│
├─ RefinedAbstraction (Laptop, Desktop, Pad)
│
◇── Implementor (Brand)
│
├─ ConcreteImplementorA (Lenovo)
└─ ConcreteImplementorB (Dell)
| 模式 | 核心意圖 | 關係 |
|---|---|---|
| 橋接 | 抽象與實現雙維度獨立擴展 | 抽象「持有」實現,構造時注入 |
| 策略 | 算法族封裝,運行時可熱插拔 | Context 持有 Strategy,可隨時 setStrategy |
| 組合 | 部分-整體樹形結構 | Component 統一接口,Leaf/Composite 遞歸 |
Connection (抽象) + MySQL/Oracle/PostgreSQL Driver (實現)Logger (抽象) + Log4j/Logback/JUL (實現) —— SLF4J 即橋接Window/Button (抽象) + Windows/Mac/Linux 實現Notification (抽象:郵件/短信/推送) + Provider (實現:阿里云/騰訊云/個推)| 優點 | 缺點 |
|---|---|
| 抽象與實現完全解耦 | 增加系統理解難度,需識別兩個變化維度 |
| 符合開閉原則,擴展極其靈活 | 適用場景較窄,僅適合「雙維度正交變化」 |
| 組合優於繼承,避免類爆炸 | 過度使用會導致代碼過度抽象 |
橋接模式是「組合優於繼承」原則的教科書級應用。當你發現系統存在兩個獨立變化的維度(如類型/品牌、協議/平台、前端/後端),且它們的組合排列組合導致類數量爆炸時,橋接模式就是最佳解藥。