Golang學習筆記_33——橋接模式

Golang學習筆記_30——建造者模式
Golang學習筆記_31——原型模式
Golang學習筆記_32——適配器模式


文章目錄

  • 橋接模式詳解
    • 一、橋接模式核心概念
      • 1. 定義
      • 2. 解決的問題
      • 3. 核心角色
      • 4. 類圖
    • 二、橋接模式的特點
    • 三、適用場景
      • 1. 多維度變化
      • 2. 跨平臺開發
      • 3. 動態切換實現
    • 四、與其他結構型模式的對比
    • 五、Go 語言代碼示例
    • 六、橋接模式的高級用法
      • 1. 多維度組合
      • 2. 動態切換實現
    • 七、總結


橋接模式詳解

一、橋接模式核心概念

1. 定義

橋接模式是一種 結構型設計模式,通過 將抽象部分與實現部分分離,使它們可以獨立變化。它通過組合關系替代繼承關系,解決多維度的擴展問題。

2. 解決的問題

  • 多維度變化:當系統存在多個獨立變化的維度時(如形狀和顏色),避免類爆炸問題。
  • 靈活擴展:允許抽象和實現部分獨立擴展,無需修改原有代碼。
  • 降低耦合:通過組合關系替代繼承,減少類之間的強依賴。

3. 核心角色

  1. Abstraction(抽象化):定義高層抽象接口,維護對實現化對象的引用。
  2. RefinedAbstraction(擴展抽象化):對抽象化的擴展,提供更精細的控制。
  3. Implementor(實現化):定義實現類的接口,提供基礎操作。
  4. ConcreteImplementor(具體實現化):實現接口的具體類。

4. 類圖

橋接模式類圖

示例類圖

二、橋接模式的特點

優點

  1. 解耦抽象與實現
    抽象層和實現層獨立變化,提高系統靈活性。
  2. 擴展性強
    新增維度只需添加對應實現類,無需修改現有代碼。
  3. 符合開閉原則
    對擴展開放,對修改關閉。

缺點

  1. 設計復雜度增加
    需要正確識別系統中獨立變化的維度。
  2. 理解成本高
    組合關系比繼承更難直觀理解。

三、適用場景

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渲染

七、總結

橋接模式通過 分離抽象與實現 解決多維度擴展問題,特別適合以下場景:

  1. 多維度變化:獨立管理不同維度的變化
  2. 跨平臺開發:統一抽象接口,差異化實現
  3. 動態配置:運行時切換實現邏輯

在 Go 中實現時需注意 組合優于繼承 的原則,通過接口定義清晰的抽象邊界。當系統存在多個獨立變化維度時,橋接模式能顯著降低代碼復雜度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70093.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

低代碼(Low Code)全解析:從概念到應用,從選擇到價值

?在數字化浪潮席卷全球的當下,企業對軟件開發的效率與靈活性愈發重視,低代碼平臺應運而生并迅速掀起技術熱潮。 本文基于筆者 6 年的低代碼實踐經驗,深入剖析低代碼的諸多方面,涵蓋其定義、發展歷程、國內平臺對比、開發流程、與…

函數重載講解

雖然在初識C-CSDN博客中介紹過,但還是感覺要單發出來大概講解下 什么是函數重載? 函數重載是指在同一個作用域內,函數名相同,但它們的 參數列表 不同。C 允許你根據函數的參數個數、類型或者順序的不同來定義多個同名函數。編譯…

14-H指數

給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。計算并返回該研究者的 h 指數。 根據維基百科上 h 指數的定義:h 代表“高引用次數” ,一名科研人員的 h 指數 是指他(她)至少發…

關于es6-module的語法

ES6(ECMAScript 2015)引入了模塊化的概念,旨在使 JavaScript 更加模塊化、可維護和可重用。ES6 模塊允許我們在不同的文件中組織和管理代碼,使得不同模塊之間的依賴關系更加清晰。 1. 導出(Export) 1.1 命…

Chrome多開終極形態解鎖!「窗口管理工具+IP隔離插件

Web3項目多開,繼ads指紋瀏覽器錢包被盜后,更多人采用原生chrome瀏覽器,當然對于新手,指紋瀏覽器每月成本也是一筆不小開支,今天逛Github發現了這樣一個解決方案,作者開發了窗口管理工具IP隔離插件&#xff…

DeepSeek核心算法解析:如何打造比肩ChatGPT的國產大模型

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《自然語言處理原理與實戰》(人工智能科學與技術叢書)【陳敬雷編著】【清華大學出版社】 文章目錄 DeepSeek大模型技術系列一DeepSeek核心算法解析:如何…

arm 入坑筆記

1.開發環境(IDE)使用keil_5 (keil_mdk) 2.兩個手冊需要關注:用戶手冊(編程需要),數據手冊(硬件) 3.32bit地址空間:0~2^324GB尋址空間及(0-FFFF_FFFF&#x…

弱監督語義分割學習計劃(0)-計劃制定

經過與deepseek的一番討論和交流,DeepSeek為我設計了一個30天高強度學習計劃,重點聚焦弱監督/無監督語義分割在野外場景的應用,結合理論與實踐,并最終導向可落地的開源項目。以下是詳細計劃: 總體策略 優先級排序&…

vscode遠程報錯:Remote host key has changed,...

重裝了Ubuntu系統之后,由20.04改為22.04,再用vscode遠程,就出現了以上報錯。 親測有效的辦法 gedit ~/.ssh/known_hosts 打開這個配置文件 刪掉與之匹配的那一行,不知道刪哪一行的話,就打開第一行這個 /.ssh/confi…

Python - 爬蟲利器 - BeautifulSoup4常用 API

文章目錄 前言BeautifulSoup4 簡介主要特點:安裝方式: 常用 API1. 創建 BeautifulSoup 對象2. 查找標簽find(): 返回匹配的第一個元素find_all(): 返回所有匹配的元素列表select_one() & select(): CSS 選擇器 3. 訪問標簽內容text 屬性: 獲取標簽內純文本get_t…

DeepSeek驅動下的數據倉庫范式轉移:技術解耦、認知重構與治理演進

DeepSeek驅動下的數據倉庫范式轉移:技術解耦、認知重構與治理演進 ——基于多場景實證的架構革命研究 一、技術解耦:自動化編程范式的演進 1.1 語義驅動的ETL生成機制 在金融風控場景中,DeepSeek通過動態語法樹解析(Dynamic Syn…

代碼隨想錄算法訓練營day38(補0206)

如果求組合數就是外層for循環遍歷物品,內層for遍歷背包。 如果求排列數就是外層for遍歷背包,內層for循環遍歷物品。 1.零錢兌換 題目 322. 零錢兌換 給你一個整數數組 coins ,表示不同面額的硬幣;以及一個整數 amount &#xff0c…

golang channel底層實現?

底層數據實現 type hchan struct { qcount uint // 當前隊列中的元素數量 dataqsiz uint // 環形隊列的大小 buf unsafe.Pointer // 指向環形隊列的指針 elemsize uint16 // 元素大小 closed uint32 // chan…

圖的最小生成樹算法: Prim算法和Kruskal算法(C++)

上一節我們學習了最短路徑算法, 這一節來學習最小生成樹. 最小生成樹(Minimum Spanning Tree, MST)算法是圖論中的一種重要算法, 主要用于在加權無向圖中找到一棵生成樹, 使得這棵樹包含圖中的所有頂點, 并且所有邊的權重之和最小. 這樣的樹被稱為最小生成樹. 最小生成樹廣泛應…

矩陣系統源碼搭建的數據管理開發功能解析,支持OEM

一、引言 在矩陣系統中,數據猶如血液,貫穿整個系統的運行。高效的數據管理開發功能是確保矩陣系統穩定、可靠運行的關鍵,它涵蓋了數據的存儲、處理、安全等多個方面。本文將深入探討矩陣系統源碼搭建過程中數據管理功能的開發要點。 二、數據…

DeepSeek 助力 Vue 開發:打造絲滑的日期選擇器(Date Picker),未使用第三方插件

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄 Deep…

操作系統知識點2

1.P,V操作可以實現進程同步,進程互斥,進程的前驅關系 2.先來先服務調度算法是不可搶占的算法 3.UNIX操作系統中,對文件系統中空閑區的管理通常采用成組鏈接法 4.對于FAT32文件系統,它采用的是鏈接結構 5.不同的I/O…

【個人開發】deepspeed+Llama-factory 本地數據多卡Lora微調【完整教程】

文章目錄 1.背景2.微調方式2.1 關鍵環境版本信息2.2 步驟2.2.1 下載llama-factory2.2.2 準備數據集2.2.3 微調模式2.2.3.1 zero-1微調2.2.3.2 zero-2微調2.2.3.3 zero-3微調2.2.3.4 單卡Lora微調 2.2.4 實驗2.2.4.1 實驗1:多GPU微調-zero12.2.4.2 實驗2:…

iOS 中使用 FFmpeg 進行音視頻處理

在 iOS 中使用 FFmpeg 進行音視頻處理,通常需要將 FFmpeg 的功能集成到項目中。由于 FFmpeg 是一個 C 庫,直接在 iOS 中使用需要進行一些配置和封裝。 1. 在 iOS 項目中集成 FFmpeg 方法 1:使用 FFmpeg 預編譯庫 下載 FFmpeg iOS 預編譯庫: 可以從以下項目中獲取預編譯的 …

Elasticsearch:將 Ollama 與推理 API 結合使用

作者:來自 Elastic Jeffrey Rengifo Ollama API 與 OpenAI API 兼容,因此將 Ollama 與 Elasticsearch 集成非常容易。 在本文中,我們將學習如何使用 Ollama 將本地模型連接到 Elasticsearch 推理模型,然后使用 Playground 向文檔提…