橋接 (Bridge)

★★★★★Studied

FromDesign Patterns (GoF)大話設計模式

📚 From the Books

橋接 (Bridge)ConceptStructural

把「抽象」與「實作」拆成兩條可獨立變化的維度,用組合把它們橋接起來,避免兩維度相乘造成的子類別爆炸。

🧠 When to Use

TIP

訊號:你的類別有兩個獨立變動的維度(如 形狀 × 繪圖 API),用繼承會變成 形狀數 × API 數 個子類別。

⚖️ Structure & Variants

經典版 — 形狀 × 繪圖 API
// 實作維度(Implementor)
interface Renderer { fun drawCircle(r: Float) }
class VectorRenderer : Renderer { override fun drawCircle(r: Float) { /* svg */ } }
class RasterRenderer : Renderer { override fun drawCircle(r: Float) { /* pixels */ } }

// 抽象維度,持有一個 Renderer(這就是「橋」)
abstract class Shape(protected val renderer: Renderer) { abstract fun draw() }

class Circle(renderer: Renderer, val r: Float) : Shape(renderer) {
    override fun draw() = renderer.drawCircle(r)
}

val c = Circle(VectorRenderer(), 5f)   // 兩維度自由組合
  • 抽象端(Shape)與實作端(Renderer)各自繼承,靠組合連接,不相乘。
和 Adapter 的差別
  • Bridge設計前期就刻意把兩維度拆開,讓它們平行演化。
  • Adapter事後把既有不相容介面接起來,常是補救既有程式。
  • 結構相似(都靠組合),差在意圖與時機。
和 Abstract Factory 的搭配
  • Bridge 決定「抽象怎麼接到實作」;Abstract Factory 可負責生產正確的 implementor 家族。
  • 兩者常搭配:Factory 建好實作物件,注入給 Bridge 的抽象端。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading