橋接模式(Bridge Pattern) 就像一座橋,把兩個原本獨立變化的東西連接起來,讓它們可以各自自由變化,互不干擾。簡單來說,就是 “把抽象和實現分開,用組合代替繼承”。
一句話理解橋接模式
假設你有一支筆(抽象)和多種顏色的墨水(實現),如果筆和墨水的顏色直接綁定(比如用繼承),每增加一種顏色就要造一種新筆。而橋接模式是讓筆和墨水獨立存在,自由組合。
生活中的例子
場景:手機(品牌)和手機功能(打電話、拍照、游戲)。
- 傳統方式:每個手機品牌(蘋果、華為)都要為每個功能單獨設計,比如“華為拍照手機”“蘋果游戲手機”,導致大量重復代碼。
- 橋接模式:
- 抽象層:手機品牌(蘋果、華為)。
- 實現層:手機功能(拍照、游戲)。
- 結果:蘋果手機+拍照功能、華為手機+游戲功能,隨意組合。
核心思想
-
解耦抽象和實現:
- 抽象層(比如“手機品牌”)不直接依賴具體實現(比如“拍照功能”)。
- 實現層可以獨立擴展,不影響抽象層。
-
用組合代替繼承:
- 通過“橋”(一個接口或抽象類)將兩者連接,而不是通過繼承強行綁定。
應用場景
-
多個維度變化:
- 比如一個系統需要支持不同操作系統(Windows、Mac)和不同界面風格(扁平化、擬物化)。
- 用橋接模式將“操作系統”和“界面風格”解耦,避免出現
Windows扁平化按鈕
、Mac擬物化按鈕
這樣的復雜繼承關系。
-
避免類爆炸:
- 當用繼承會導致子類數量指數級增長時(比如
品牌×功能×顏色
),橋接模式可以大幅減少類的數量。
- 當用繼承會導致子類數量指數級增長時(比如
-
運行時動態切換實現:
- 比如一個圖形繪制工具,可以運行時切換不同的渲染引擎(OpenGL、DirectX)。
-
跨平臺開發:
- 抽象層定義通用操作(比如“顯示彈窗”),實現層針對不同平臺(Android、iOS)編寫具體邏輯。
代碼示例(簡化版)
// 實現層接口:墨水顏色
interface Ink {String getColor();
}// 具體實現:紅色墨水
class RedInk implements Ink {public String getColor() { return "紅色"; }
}// 抽象層:筆
abstract class Pen {protected Ink ink; // 橋接的關鍵:組合墨水public Pen(Ink ink) { this.ink = ink; }public abstract void write();
}// 具體抽象:鋼筆
class FountainPen extends Pen {public FountainPen(Ink ink) { super(ink); }public void write() {System.out.println("鋼筆寫出" + ink.getColor() + "字");}
}// 使用
public class Main {public static void main(String[] args) {Ink redInk = new RedInk();Pen pen = new FountainPen(redInk); // 鋼筆+紅墨水pen.write(); // 輸出:鋼筆寫出紅色字}
}
總結
-
什么時候用橋接模式?
當系統中存在多個獨立變化的維度,且不希望用繼承強行綁定時。 -
好處:
- 減少代碼重復和類爆炸。
- 擴展靈活(新增一個維度只需增加對應實現)。
- 符合“開閉原則”(對擴展開放,對修改關閉)。
記住這個模式的核心:“搭橋連兩岸,各自奔前程” 🚀。