Golang學習筆記_30——建造者模式
Golang學習筆記_31——原型模式
Golang學習筆記_32——適配器模式
文章目錄
- 橋接模式詳解
- 一、橋接模式核心概念
- 1. 定義
- 2. 解決的問題
- 3. 核心角色
- 4. 類圖
- 二、橋接模式的特點
- 三、適用場景
- 1. 多維度變化
- 2. 跨平臺開發
- 3. 動態切換實現
- 四、與其他結構型模式的對比
- 五、Go 語言代碼示例
- 六、橋接模式的高級用法
- 1. 多維度組合
- 2. 動態切換實現
- 七、總結
橋接模式詳解
一、橋接模式核心概念
1. 定義
橋接模式是一種 結構型設計模式,通過 將抽象部分與實現部分分離,使它們可以獨立變化。它通過組合關系替代繼承關系,解決多維度的擴展問題。
2. 解決的問題
- 多維度變化:當系統存在多個獨立變化的維度時(如形狀和顏色),避免類爆炸問題。
- 靈活擴展:允許抽象和實現部分獨立擴展,無需修改原有代碼。
- 降低耦合:通過組合關系替代繼承,減少類之間的強依賴。
3. 核心角色
- Abstraction(抽象化):定義高層抽象接口,維護對實現化對象的引用。
- RefinedAbstraction(擴展抽象化):對抽象化的擴展,提供更精細的控制。
- Implementor(實現化):定義實現類的接口,提供基礎操作。
- ConcreteImplementor(具體實現化):實現接口的具體類。
4. 類圖
二、橋接模式的特點
優點
- 解耦抽象與實現
抽象層和實現層獨立變化,提高系統靈活性。 - 擴展性強
新增維度只需添加對應實現類,無需修改現有代碼。 - 符合開閉原則
對擴展開放,對修改關閉。
缺點
- 設計復雜度增加
需要正確識別系統中獨立變化的維度。 - 理解成本高
組合關系比繼承更難直觀理解。
三、適用場景
1. 多維度變化
- 示例:圖形繪制系統(形狀 × 顏色 × 渲染引擎)
- 解決:將形狀作為抽象,顏色和渲染作為獨立實現。
2. 跨平臺開發
- 示例:支持 Android/iOS 的 UI 組件庫
- 解決:UI 組件抽象與平臺具體實現分離。
3. 動態切換實現
- 示例:數據庫驅動切換(MySQL/PostgreSQL)
- 解決:通過橋接接口動態替換底層實現。
四、與其他結構型模式的對比
模式 | 核心目標 | 關鍵區別 |
---|---|---|
適配器 | 解決接口不兼容問題 | 關注接口轉換,通常在系統設計后期使用 |
組合 | 處理樹形結構 | 強調部分與整體的層次關系 |
橋接 | 分離抽象與實現 | 關注多維度的獨立擴展 |
五、Go 語言代碼示例
場景描述
實現跨平臺圖形渲染系統,支持不同形狀(圓形/矩形)在不同平臺(Windows/Linux)的繪制。
代碼實現
package bridgedemoimport "fmt"// Renderer 渲染器接口
type Renderer interface {RenderCircle(radius float32)RenderRectangle(width, height float32)
}// WindowsRenderer windows渲染器實現
type WindowsRenderer struct{}func (w *WindowsRenderer) RenderCircle(radius float32) {// 渲染windows矩形的實現fmt.Printf("windows render circle: radius = %f\n", radius)
}func (w *WindowsRenderer) RenderRectangle(width, height float32) {// 渲染Windows矩形的實現fmt.Printf("windows render rectangle: width = %f, height = %f\n", width, height)
}// LinuxRenderer linux渲染器實現
type LinuxRenderer struct{}func (l *LinuxRenderer) RenderCircle(radius float32) {// 渲染Linux圓形的實現fmt.Printf("linux render circle: radius = %f\n", radius)
}func (l *LinuxRenderer) RenderRectangle(width, height float32) {// 渲染Linux矩形的實現fmt.Printf("linux render rectangle: width = %f, height = %f\n", width, height)
}// Shape 圖形接口
type Shape interface {Draw()
}// Circle 圓形
type Circle struct {Radius float32Renderer Renderer
}func NewCircle(radius float32, renderer Renderer) *Circle {return &Circle{Radius: radius,Renderer: renderer,}
}func (c *Circle) Draw() {c.Renderer.RenderCircle(c.Radius)
}// Rectangle 矩形
type Rectangle struct {Width float32Height float32Renderer Renderer
}func newRectangle(width, height float32, renderer Renderer) *Rectangle {return &Rectangle{Width: width,Height: height,Renderer: renderer,}
}func (r *Rectangle) Draw() {r.Renderer.RenderRectangle(r.Width, r.Height)
}func test() {// 創建Windows渲染器windowsRenderer := &WindowsRenderer{}// 創建Linux渲染器linuxRenderer := &LinuxRenderer{}// 創建跨平臺圖形shapes := []Shape{NewCircle(5.0, windowsRenderer),NewCircle(8.0, linuxRenderer),newRectangle(10.0, 20.0, windowsRenderer),newRectangle(15.0, 25.0, linuxRenderer),}// 繪制圖形for _, shape := range shapes {shape.Draw()}
}
輸出結果
=== RUN Test_test
windows render circle: radius = 5.000000
linux render circle: radius = 8.000000
windows render rectangle: width = 10.000000, height = 20.000000
linux render rectangle: width = 15.000000, height = 25.000000
--- PASS: Test_test (0.00s)
PASS
六、橋接模式的高級用法
1. 多維度組合
// 添加顏色維度
type ColorImplementor interface {SetColor(color string)
}type ColoredShape struct {shape Shapecolor string
}func (c *ColoredShape) Draw() {fmt.Printf("設置顏色: %s\n", c.color)c.shape.Draw()
}
2. 動態切換實現
// 運行時切換渲染引擎
rect := NewRectangle(winRenderer, 15, 25)
rect.Draw() // Windows渲染rect.renderer = linuxRenderer
rect.Draw() // Linux渲染
七、總結
橋接模式通過 分離抽象與實現 解決多維度擴展問題,特別適合以下場景:
- 多維度變化:獨立管理不同維度的變化
- 跨平臺開發:統一抽象接口,差異化實現
- 動態配置:運行時切換實現邏輯
在 Go 中實現時需注意 組合優于繼承 的原則,通過接口定義清晰的抽象邊界。當系統存在多個獨立變化維度時,橋接模式能顯著降低代碼復雜度。