23種設計模式——橋接模式 (Bridge Pattern)詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。
🍎個人主頁:Meteors.的博客
💞當前專欄:設計模式
?特色專欄:知識分享
🥭本文內容:23種設計模式——橋接模式 (Bridge Pattern)
📚 ** ps **? :閱讀文章如果有問題或者疑惑,歡迎在評論區提問或指出。


目錄

一. 背景

二. 介紹

三.?模式結構

四. 代碼示例

五. 使用橋接模式的原因

六.??橋接模式的優缺點

1. 優點

2. 缺點:

七. 適用場景

八.?與其他模式的區別

九.?實際應用場景

十. 總結


一. 背景

橋接模式......不僅僅名字聽著陌生,在看一些比較復雜的示例代碼的時候也是一臉懵。后來仔細看看,終于有了思路——橋接模式其實就是把代碼中需要變的地方換成抽象或者接口,并把它作為參數傳入即可。橋接模式有兩個地方要變(抽象與實現),于是代碼就有兩個地方用接口或者抽象!


二. 介紹

橋接模式是一種結構型設計模式,它將抽象部分與實現部分分離,使它們可以獨立變化。橋接模式通過組合關系代替繼承關系,從而降低抽象和實現這兩個可變維度的耦合度。


三.?模式結構

橋接模式包含以下主要角色:

  1. 抽象化(Abstraction)??:定義抽象接口,維護對實現化對象的引用
  2. 擴展抽象化(Refined Abstraction)??:擴展抽象化定義的接口
  3. 實現化(Implementor)??:定義實現類的接口
  4. 具體實現化(Concrete Implementor)??:實現實現化接口

四. 代碼示例

實現一個圖形繪制系統,支持多種形狀和多種顏色(形狀和顏色要可擴展)。

實現代碼:

// 實現化接口:顏色
interface Color {void applyColor();
}// 具體實現化:紅色
class Red implements Color {@Overridepublic void applyColor() {System.out.println("應用紅色");}
}// 具體實現化:藍色
class Blue implements Color {@Overridepublic void applyColor() {System.out.println("應用藍色");}
}// 抽象化:形狀
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw();
}// 擴展抽象化:圓形
class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("繪制圓形,");color.applyColor();}
}// 擴展抽象化:方形
class Square extends Shape {public Square(Color color) {super(color);}@Overridevoid draw() {System.out.print("繪制方形,");color.applyColor();}
}// 客戶端代碼
public class BridgePatternDemo {public static void main(String[] args) {// 創建紅色圓形Shape redCircle = new Circle(new Red());redCircle.draw();// 創建藍色方形Shape blueSquare = new Square(new Blue());blueSquare.draw();// 創建藍色圓形Shape blueCircle = new Circle(new Blue());blueCircle.draw();}
}

通過上面的實現,我們就可以進一步擴展系統,比如添加更多形狀(三角形)或顏色(綠色)而不影響現有代碼。


五. 使用橋接模式的原因

通過上面的案例,我們就很好理解使用橋接模式的原因了:
解耦抽象和實現:將抽象部分和實現部分分離,使它們可以獨立變化
提高可擴展性:可以獨立地擴展抽象部分和實現部分
符合開閉原則:對擴展開放,對修改關閉
隱藏實現細節:客戶端不需要知道實現的細節


六.??橋接模式的優缺點

1. 優點

分離接口和實現:抽象和實現可以獨立擴展
提高可擴展性:可以獨立地擴展抽象部分和實現部分
符合開閉原則:對擴展開放,對修改關閉
隱藏實現細節:客戶端不需要知道實現的細節
減少子類數量:避免了多重繼承導致的類爆炸問題

2. 缺點:

增加系統復雜度:需要正確識別出系統中兩個獨立變化的維度
設計難度增加:需要預先識別出系統中的抽象和實現部分


七. 適用場景

  • 不希望在抽象和實現部分之間有固定的綁定關系:比如在程序運行時實現部分應可以被子類化
  • 類的抽象以及其實現都應該可以通過生成子類的方法加以擴充
  • 對一個抽象的實現部分的修改應對客戶不產生影響
  • 想在多個對象間共享實現,但同時要求客戶并不知道
  • 想通過繼承或組合方式,在多個抽象和實現之間進行組合

八.?與其他模式的區別

  • 與適配器模式:適配器模式是后期為了兼容而做的補救措施,橋接模式是前期設計時的架構選擇
  • 與裝飾器模式:裝飾器模式是為了增加功能,橋接模式是為了分離抽象和實現
  • 與策略模式:策略模式關注算法的替換,橋接模式關注抽象和實現的分離

九.?實際應用場景

圖形渲染系統:不同的圖形(圓形、矩形)可以在不同的平臺(Windows、Linux)上渲染
數據庫驅動:同一套數據庫操作接口可以適配不同的數據庫(MySQL、Oracle、PostgreSQL)
消息發送系統:不同類型的消息(郵件、短信)可以通過不同的渠道(郵件服務器、短信網關)發送
游戲開發:不同的游戲角色可以在不同的平臺上運行


十. 總結

橋接模式是一種非常有用的結構型設計模式,它通過將抽象部分與實現部分分離,使它們可以獨立變化。這種模式特別適用于需要在多個維度上擴展的系統,能夠有效避免類的爆炸性增長,提高系統的靈活性和可維護性。
在實際開發中,當我們發現系統中存在多個變化維度,且這些維度需要獨立變化時,就可以考慮使用橋接模式。通過合理運用橋接模式,可以讓我們的代碼更加靈活、可擴展,并且符合面向對象設計原則。


最后,

? ? ? ? 其它設計模式會陸續更新,希望文章對你有所幫助!

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

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

相關文章

Python爬蟲實戰:研究Axes Grid模塊,構建旅游平臺酒店數據采集和分析系統

1. 引言 1.1 研究背景 隨著互聯網技術的飛速發展,全球數據總量呈現指數級增長。據國際數據公司(IDC)預測,到 2025 年全球數據圈將達到 175ZB,其中非結構化數據占比超過 80%。這些數據廣泛分布于各類網站平臺,包含著用戶行為、市場趨勢、產品特征等豐富信息。如何高效獲…

光照邊疆平臺|面向邊疆地區的現代化內容與信息服務系統

光照邊疆平臺|面向邊疆地區的現代化內容與信息服務系統聚焦“邊疆資訊 邊疆風光 用戶互動 后臺可視化管控”的高顏值內容平臺,適合展示、傳播與運營邊疆主題內容。系統定位與價值 主題聚焦:以“邊疆”為核心,統一內容語義與視覺…

刪除元素(不是刪除而是覆蓋)快慢指針 慢指針是覆蓋位置,快指針找元素

📝 題目:移除元素題目描述: 給定數組和值val,原地移除所有等于val的元素,返回新長度。例子: nums [3,2,2,3], val 3 → nums [2,2,_,_], return 2🔥 暴力法思路:暴力法想法&#…

10 【C++】泛型編程

文章目錄前言泛型編程(模板)1. 函數模板1.1 函數模板格式1.2 函數模板的實例化隱式實例化顯式指定模板參數實例化1.3 函數模板實例化的原理1.4 模板參數的匹配原則2. 類模板2.1 類模板的格式2.2 類模板的實例化2.3 類模板實例化的原理2.4 類模板的匹配原…

【基于YOLO和Web的交通工具識別系統】

系統功能 視頻檢測:對輸入的視頻流進行實時或離線分析,自動識別視頻中出現的交通工具(如飛機、自行車等)及行人,輸出包含目標類別、位置等信息的檢測結果。攝像檢測:通過連接攝像頭設備,對實時…

Python進程,線程

目錄 一、多任務 1.1定義 1.2具體體現 1.3并發和并行 1.3.1并發操作 1.3.2并行操作 1.3.3對比 二、進程 2.1概念 2.2特點 2.3進程狀態 2.4多進程 2.5多進程實現 2.6進程鎖 三、線程 3.1概念 3.2特點 3.3適用場景 3.4多線程實現 四、對比 4.1關系對? 4.2區…

【Element Plus 表單組件樣式統一 CSS 文字特效實現指南】

Element Plus 表單組件樣式統一 & CSS 文字特效實現指南 前言 在使用 Element Plus 組件庫開發表單頁面時,我們遇到了一個看似簡單卻很有趣的問題:el-input、el-select 和 el-textarea 在禁用狀態下的文字顏色不一致。通過深入研究,我們…

網絡通信與協議棧 -- OSI,TCP/IP模型,協議族,UDP編程

網絡通信的核心是實現不同主機上進程間的數據交換,其技術體系圍繞 “協議分層模型” 展開,向下依賴硬件介質傳輸電 / 光信號,向上支撐各類網絡應用(如網頁瀏覽、文件傳輸)。本文結合 OSI 理論框架與 TCP/IP 工業標準&a…

HarmonyOS 新一代聲明式 UI 彈窗機制:從 AlertDialog 到 CustomDialogController 的深度解析與實踐

好的,請看這篇關于 HarmonyOS 新一代聲明式 UI 彈窗機制的技術文章。 HarmonyOS 新一代聲明式 UI 彈窗機制:從 AlertDialog 到 CustomDialogController 的深度解析與實踐 引言 在 HarmonyOS 應用開發中,彈窗(Dialog)是…

混合推理模型(快思考、慢思考模型)

目錄基礎transformer架構、transformers庫預訓練模型的微調(Fine-tuning)預訓練微調的大模型應用模式base 模型、instruct 模型區別Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安裝 # 1,下載 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面機裝備中的應用

隨著食品加工行業向自動化、智能化轉型,面機裝備對控制系統的響應速度、布線靈活性及穩定性提出了更高要求。本案例以某大型食品機械制造企業的全自動面條生產線升級項目為背景,引入 MR30 分布式 IO 模塊替代傳統集中式 IO 方案。通過將 MR30 分布式 IO …

Matlab使用小技巧合集(系列四):Table類型高效用法與數據處理實戰

Matlab使用小技巧合集(系列四):Table類型高效用法與數據處理實戰 在科研數據處理和論文寫作過程中,結構化數據的管理極為重要。Matlab的table類型為研究生和科研人員提供了靈活、高效的數據存儲與處理方式,尤其適合實驗結果整理、分組統計、數據預處理等場景。本文將系統介…

STM32的時鐘系統與時鐘樹的配置

STM32的時鐘系統是其微控制器(MCU)的核心組成部分,負責為CPU、外設和存儲器等模塊提供精確的時序信號。其設計靈活且復雜,通過多級時鐘樹(Clock Tree)實現時鐘源的選擇、分頻和分配。以下是詳細介紹&#x…

NV 工具metrics分析(ncu, nsys/torch profiler)

以下分析都以A100硬件架構為例; Theoretical Max Active Warps per SM: 64 Register number: 512 (規定每個thread不能超過256) Theoretical Active Warps per SM [warp]:512//registers_per_thread*4, which defines theoretical active warp occupancy Waves P…

[CISCN2019 總決賽 Day2 Web1]Easyweb

登錄界面可以看到隨機切換的圖片。從頁面源碼中可以看到<div class"avtar"><img src"image.php?id3" width"200" height"200"/></div>&#xff0c;圖片文件的請求地址&#xff0c;并且有傳參id。web應用中像這種動…

第 3 講:KAFKA生產者(Producer)詳解

這是一篇既照顧入門也能給高級工程師提供落地經驗的實戰筆記。0. TL;DR&#xff08;先上結論&#xff09; 想穩&#xff1a;acksall 合理 retries&#xff1b;需要“分區內不重不丟”→ 再加 enable.idempotencetrue 且 max.in.flight<5。想快&#xff1a;適度增大 batch.s…

微信小程序截屏與錄屏功能詳解

微信小程序提供了豐富的API支持截屏和錄屏功能&#xff0c;適用于多種場景&#xff0c;如教育類應用的課程錄制、游戲類應用的精彩瞬間分享、電商類應用的商品展示等。以下將詳細介紹實現方法和應用案例。 截屏功能實現 截屏功能通過調用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

寫在前面 在函數式組件主導的 React 項目中&#xff0c;高階組件&#xff08;HOC&#xff09;并非首選推薦&#xff0c;更建議優先使用 Hooks來實現復用邏輯。核心原因是 HOC 存在固有的設計缺陷&#xff0c;而 Hooks 能更優雅、簡潔地解決相同問題&#xff0c;同時避免 HOC 的…

【 蒼穹外賣 | Day2】

1. 相關視頻 Day2的全部視頻集數 2. 學習記錄 2.1 對象屬性拷貝 當DTO與實體類或者VO對象之間的一個裝換的時候&#xff0c;如果通過new創建對象&#xff0c;然后調用set方法進行屬性賦值&#xff0c;不夠方便&#xff0c;代碼不夠簡潔。當屬性過多時候&#xff0c;代碼就會…