設計模式精講 Day 7:橋接模式(Bridge Pattern)

【設計模式精講 Day 7】橋接模式(Bridge Pattern)


文章簡述

在軟件系統中,類的繼承關系往往會導致類爆炸,尤其是在需要組合多種功能或行為時。橋接模式(Bridge Pattern)通過將抽象部分與其實現部分分離,使得它們可以獨立變化,從而有效解耦類之間的依賴關系。本文詳細講解了橋接模式的核心思想、結構組成和實現方式,并結合真實項目案例分析其應用場景。文章還深入探討了該模式如何遵循SOLID原則,以及在Java標準庫和主流框架中的實際應用。通過完整的代碼示例和單元測試,幫助讀者掌握如何在實際項目中靈活運用橋接模式提升系統的可擴展性和維護性。


模式定義

橋接模式(Bridge Pattern) 是一種結構型設計模式,它將一個抽象部分(Abstraction)與它的實現部分(Implementation)分離,使它們可以獨立變化。該模式的核心思想是:通過組合而非繼承的方式,避免類層次結構的膨脹

核心思想

  • 抽象部分定義高層操作接口。
  • 實現部分提供具體的實現邏輯。
  • 兩者通過組合建立聯系,而不是通過繼承。

模式結構

UML類圖描述(文字版)

  • Abstraction(抽象類):定義高層操作接口,包含對實現部分的引用。
  • RefinedAbstraction(擴展抽象類):對抽象類的擴展,可能添加新的操作。
  • Implementor(實現接口):定義實現部分的接口,供抽象類調用。
  • ConcreteImplementorA / B(具體實現類):實現Implementor接口的具體類。

類圖關系說明:

  • Abstraction 持有 Implementor 的引用。
  • RefinedAbstraction 繼承自 Abstraction,并可能擴展其功能。
  • ConcreteImplementorAConcreteImplementorB 分別實現 Implementor 接口的不同版本。

適用場景

橋接模式適用于以下情況:

場景描述
多維度變化當系統存在多個維度的變化(如不同的平臺、不同的算法),且這些變化相互獨立時。
避免類爆炸當使用繼承導致類數量劇增時,可通過組合替代繼承。
系統可擴展性要求高需要頻繁增加新的實現或抽象時,橋接模式能提高系統的靈活性。

實現方式

示例:圖形繪制系統

我們模擬一個圖形繪制系統,支持不同形狀(如圓形、方形)和不同渲染方式(如矢量圖、位圖)。

1. 定義實現接口(Implementor)
// 實現接口:圖形渲染方式
interface Renderer {String renderShape();
}
2. 實現具體類(ConcreteImplementor)
// 矢量圖渲染器
class VectorRenderer implements Renderer {@Overridepublic String renderShape() {return "Vector shape";}
}// 位圖渲染器
class BitmapRenderer implements Renderer {@Overridepublic String renderShape() {return "Bitmap shape";}
}
3. 定義抽象類(Abstraction)
// 圖形抽象類
abstract class Shape {protected Renderer renderer;protected Shape(Renderer renderer) {this.renderer = renderer;}abstract String draw();
}
4. 擴展抽象類(RefinedAbstraction)
// 圓形類
class Circle extends Shape {private double radius;public Circle(double radius, Renderer renderer) {super(renderer);this.radius = radius;}@OverrideString draw() {return "Circle: " + renderer.renderShape() + ", Radius: " + radius;}
}// 方形類
class Square extends Shape {private double side;public Square(double side, Renderer renderer) {super(renderer);this.side = side;}@OverrideString draw() {return "Square: " + renderer.renderShape() + ", Side: " + side;}
}
5. 使用示例
public class BridgePatternDemo {public static void main(String[] args) {// 創建兩個不同的渲染器Renderer vectorRenderer = new VectorRenderer();Renderer bitmapRenderer = new BitmapRenderer();// 使用不同的渲染器創建圖形Shape circleWithVector = new Circle(5, vectorRenderer);Shape squareWithBitmap = new Square(10, bitmapRenderer);// 輸出結果System.out.println(circleWithVector.draw());System.out.println(squareWithBitmap.draw());}
}

輸出結果:

Circle: Vector shape, Radius: 5.0
Square: Bitmap shape, Side: 10.0

工作原理

橋接模式通過將抽象部分實現部分進行解耦,使得它們可以獨立變化。這種設計方式避免了傳統繼承帶來的類爆炸問題,同時提升了系統的靈活性和可維護性。

  • 抽象類負責定義高層操作接口。
  • 實現類負責具體功能的實現。
  • 組合代替繼承:抽象類不再直接依賴于具體實現,而是通過接口調用,從而降低耦合度。

優缺點分析

優點缺點
1. 解耦抽象與實現,提高可維護性。1. 增加系統復雜度,適合有一定規模的項目。
2. 支持獨立變化,提高系統擴展性。2. 對于簡單場景,可能會顯得過于復雜。
3. 符合開閉原則,易于新增實現或抽象。4. 需要合理設計接口,否則可能導致接口臃腫。

案例分析

場景描述

某電商平臺需要支持多語言商品展示,每個商品類型(如圖書、電子產品)需要根據用戶語言(如中文、英文)展示不同的信息格式。

問題分析

  • 如果采用繼承方式,每種商品類型都需要為每種語言編寫子類,導致類爆炸。
  • 不同商品類型和語言的組合過多,難以維護。

解決方案

使用橋接模式,將商品類型(抽象部分)與語言處理(實現部分)分離:

  • 抽象部分:商品類型(如Book、Electronics)
  • 實現部分:語言處理(如ChineseTranslator、EnglishTranslator)
代碼實現
// 語言處理接口
interface LanguageTranslator {String translate(String content);
}// 中文翻譯器
class ChineseTranslator implements LanguageTranslator {@Overridepublic String translate(String content) {return "中文:" + content;}
}// 英文翻譯器
class EnglishTranslator implements LanguageTranslator {@Overridepublic String translate(String content) {return "English: " + content;}
}// 商品抽象類
abstract class Product {protected LanguageTranslator translator;public Product(LanguageTranslator translator) {this.translator = translator;}abstract String display();
}// 圖書類
class Book extends Product {private String title;public Book(String title, LanguageTranslator translator) {super(translator);this.title = title;}@OverrideString display() {return translator.translate(title);}
}// 電子產品類
class Electronics extends Product {private String name;public Electronics(String name, LanguageTranslator translator) {super(translator);this.name = name;}@OverrideString display() {return translator.translate(name);}
}
使用示例
public class ProductBridgeExample {public static void main(String[] args) {LanguageTranslator chinese = new ChineseTranslator();LanguageTranslator english = new EnglishTranslator();Product book = new Book("Java編程思想", chinese);Product phone = new Electronics("iPhone", english);System.out.println(book.display()); // 中文:Java編程思想System.out.println(phone.display()); // English: iPhone}
}

與其他模式的關系

模式關系說明
組合模式相似但不同橋接模式強調“抽象”與“實現”的分離,而組合模式關注對象的層次結構。
適配器模式補充關系橋接模式用于解耦,適配器模式用于兼容不同接口。
裝飾器模式可結合使用裝飾器可以在橋接模式的基礎上動態增強功能。
策略模式類似但用途不同策略模式用于封裝算法,橋接模式用于解耦抽象與實現。

總結

本篇文章詳細介紹了橋接模式的設計思想、實現方式及其在實際項目中的應用。通過將抽象部分與實現部分分離,橋接模式有效地解決了類繼承帶來的類爆炸問題,提高了系統的可擴展性和可維護性。

核心知識點回顧:

  • 橋接模式通過組合方式替代繼承,實現抽象與實現的解耦。
  • 適用于多維度變化、類爆炸、可擴展性要求高的場景。
  • 在Java標準庫中,java.awt包中的圖形繪制系統也采用了橋接模式的思想。
  • 與組合、裝飾器等模式有密切關聯,可根據需求靈活選擇。

下一篇預告

Day 8: 組合模式(Composite Pattern)

我們將深入講解組合模式的原理與實現,了解如何構建樹形結構以表示“整體-部分”關系,適用于文件系統、UI組件等場景。


文章標簽

design-patterns, bridge-pattern, java, oop, software-design, architecture, java8, design-patterns-explained


進一步學習資料

  1. Design Patterns: Elements of Reusable Object-Oriented Software (GoF Book)
  2. Java Design Patterns - Bridge Pattern
  3. Bridge Pattern in Java - GeeksforGeeks
  4. Java 8 and Beyond: Design Patterns
  5. Java AWT and Swing Architecture - Bridge Pattern Example

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

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

相關文章

Apipost 簽約銳捷網絡:AI賦能,共推 ICT 領域 API 生態智能化升級

日前,北京北極狐信息科技有限公司(簡稱 “北極狐科技”)與銳捷網絡股份有限公司(簡稱 “銳捷網絡”)正式簽署合作協議,雙方將聚焦 ICT 基礎設施及解決方案領域,圍繞 API 全鏈路管理與智能化研發…

RK3568筆記八十三:RTMP推流H264和PCM

若該文為原創文章,轉載請注明原文出處。 前面有通過勇哥,實現了RTMP推流,但一直想加上音頻,所以經過測試,寫了一個demo, ffmpeg是使用ubuntu下安裝測試的。 安裝參考:Ubuntu20.4下x264、x265、fdk-aac和FFmpeg4.3源碼編譯安裝_ubuntu安裝libx264-CSDN博客 記錄:實現從…

產業園智慧化升級中 DDC 樓宇自控系統的集成應用優勢:多業態協同與能源可視化管控?

摘要? 在產業園智慧化升級浪潮中,直接數字控制(DDC)系統憑借強大的集成能力,成為實現多業態協同與能源可視化管控的核心技術。本文深入剖析 DDC 系統在整合園區多元業態、優化能源管理方面的獨特優勢,通過系統集成打…

Vue 3瀑布流組件實現詳解 - 圖片展示方案

引言:瀑布流布局的魅力與應用場景 在當今富媒體內容主導的網絡環境中,瀑布流布局已成為展示圖片商品等內容的流行方式。它通過動態布局算法在有限空間內最大化內容展示,提供視覺連續性和流暢瀏覽體驗。本文將深入探討如何使用Vue 3實現一個功…

如何確保郵件內容符合反垃圾郵件規范?

一、遵守相關法規 美國《CAN-SPAM法案》規定,郵件頭信息必須真實準確,要標明廣告性質、提供有效地址,并在 10 個工作日內響應退訂請求。 歐盟《通用數據保護條例》(GDPR)強調獲得用戶明確同意,數據使用要…

MQ解決高并發下訂單問題,實現流量削峰

文章目錄 示例:電商秒殺系統中的流量削峰1. 依賴引入(Maven)2. 消息隊列配置(RabbitMQ)3. 生產者:訂單服務(接收高并發請求)4. 消費者:庫存服務(按系統容量處…

【二進制安全作業】250616課上作業2 - 棧溢出漏洞利用

文章目錄 前言一、使用環境二、程序源碼1. C語言源碼2. 編譯方式 三、源碼分析四、反匯編分析1. 檢查文件安全性2. 查找目標函數3. 計算偏移量4. 繞過 strlen5. 繞過 if 五、編寫EXP結語 前言 直接進入正題 一、使用環境 處理器架構:x86_64 操作系統:U…

Python類型處理與推導式

歡迎來到啾啾的博客🐱。 記錄學習點滴。分享工作思考和實用技巧,偶爾也分享一些雜談💬。 有很多很多不足的地方,歡迎評論交流,感謝您的閱讀和評論😄。 目錄 1 引言2 類型處理3 高效操作AI開發常見數據結構3…

數據庫char字段做trim之后查詢很慢的解決方式

select * from TABLE0 where trim(column1):param 當表數據量大時,即使給column1字段加上索引,這條查詢語句也會很慢。 因為使用trim函數后,column1的索引會失效,有兩種處理方法: 1.給表加上trim(column1)函數索引 …

Kafka核心架構解析:從CAP理論到消息可靠性的設計哲學

摘要 本文從分布式系統CAP理論和消息可靠性兩個視角深入解析Kafka的架構設計,通過概念關系圖和組件交互圖揭示其核心設計思想,并詳細拆解各組件功能與協作機制。文章包含完整的交互流程分析和配置參數說明,是理解Kafka設計精髓的實用指南。 一…

LeetCode 275.H指數 II

題目: 給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數,citations 已經按照 非降序排列 。計算并返回該研究者的 h 指數。 h 指數的定義:h 代表“高引用次數”(high citations&…

OV汽車攝像頭cmos sensor 相關情況介紹

OV汽車攝像頭cmos sensor 相關情況介紹 文章目錄 OV汽車攝像頭cmos sensor 相關情況介紹**1. 汽車攝像頭三大場景應用****2. 車載CMOS SENSOR的核心技術****3. 兩大車規認證:實現真正的車規可靠性****4. 最新產品**2022年,汽車智能化加碼提速,被譽為“智能駕駛之眼”的車載攝…

Pinia在多步驟表單中的實踐應用

引言 Pinia是Vue 3推薦的狀態管理庫,相比Vuex提供了更簡潔的API、更好的TypeScript支持和更靈活的組合式風格。本文基于實際項目代碼,詳細介紹Pinia在多步驟表單場景中的應用方法。 1. Pinia Store的創建與設計 1.1 基礎Store結構 在src/store/modul…

目標檢測之YOLOV11的環境搭建

1 創建虛擬環境 conda create -n yolov11 python3.9 conda activate yolov112 安裝ultralytics 默認是有cuda的情況下 # Install all packages together using conda conda install pytorch torchvision conda 還不能直接安裝ultralytics,需要通過pip進行安裝 …

Android 構建配置中的變量(通常在設備制造商或定制 ROM 的 AndroidProducts.mk 或產品配置文件中定義)

以下是 Android 構建系統中常見的用于產品配置、資源復制和構建規則的變量 1. PRODUCT_COPY_FILES 作用:指定需要從源碼樹復制到鏡像的文件。示例:PRODUCT_COPY_FILES \device/manufacturer/device_name/file.conf:$(TARGET_COPY_OUT_VENDOR)/etc/file…

火山引擎項亮:機器學習與智能推薦平臺多云部署解決方案正式發布

資料來源:火山引擎-開發者社區 2022年7月20日,火山引擎2022 Force原動力大會在北京諾金酒店成功舉辦。在上午的議程中,《推薦系統實踐》一書的作者、同時也是火山引擎機器學習系統負責人——項亮,展開了題目為《開放AI基建&#x…

NVR的方法多種取決于應用場景

攝像頭接入NVR(網絡視頻錄像機)的方法通常取決于具體的應用場景和設備支持的功能。 一、通過局域網接入 設備連接 : 將攝像機通過網絡線纜連接到NVR的對應端口,或者將攝像機和NVR都連接到同一個路由器/交換機上,確保它…

JAVA從入門到精通一文搞定

博主介紹: 大家好,我是想成為Super的Yuperman,互聯網宇宙廠經驗,17年醫療健康行業的碼拉松奔跑者,曾擔任技術專家、架構師、研發總監負責和主導多個應用架構。 近期專注: DeepSeek應用,RPA應用研…

火山引擎發布大模型生態廣場MCP Servers,LAS MCP助力AI數據湖構建

資料來源:火山引擎-開發者社區 近日,火山引擎發布大模型生態廣場—— MCP Servers,借助字節跳動生態能力,通過“MCP Market(工具廣場) 火山方舟(大模型服務)Trae(應用開…

NodeJS 對接 Outlook 發信服務器實現發信功能

示例代碼: const express require(express); const nodemailer require(nodemailer); const querystring require(querystring); const axios require(axios);const app express(); app.use(express.json());const transporter nodemailer.createTransport({…