設計模式-結構型-橋接模式

1. 什么是橋接模式?

橋接模式(Bridge Pattern) 是一種結構型設計模式,它旨在將抽象部分與實現部分分離,使它們可以獨立變化。通過這種方式,系統可以在抽象和實現兩方面進行擴展,而無需相互影響。

核心思想

橋接模式的核心思想是將抽象實現解耦,使得它們可以獨立擴展。它通過引入一個“橋接接口”,在抽象層和實現層之間建立一個橋梁。

適用場景

橋接模式適用于以下場景:

  1. 需要在兩個維度上擴展:比如圖形與顏色、設備與操作系統等。
  2. 避免類的數量爆炸:當類的組合維度過多時,使用橋接模式可以避免創建大量的子類。
  3. 希望實現抽象和具體實現分離:提高系統的靈活性和可維護性。

2. 橋接模式的結構

UML 類圖

圖像來源

核心角色

  1. Abstraction(抽象類)
    定義抽象部分的接口,包含一個指向實現部分 Implementor 的引用。

  2. RefinedAbstraction(擴充抽象類)
    繼承自 Abstraction,擴展其功能。

  3. Implementor(實現接口)
    定義實現部分的接口,通常為抽象接口,供具體實現類實現。

  4. ConcreteImplementor(具體實現類)
    實現 Implementor 接口,完成具體操作。


3. 橋接模式的示例

場景描述

假設我們需要設計一個繪圖系統,支持不同類型的形狀(如圓形和矩形)以及不同顏色的渲染方式(如紅色和藍色)。如果直接使用繼承,可能需要創建大量子類(如紅色圓形、藍色矩形等),橋接模式可以優雅地解決這個問題。

代碼實現

# 實現部分:定義顏色
class Color:def apply_color(self):passclass RedColor(Color):def apply_color(self):return "Red"class BlueColor(Color):def apply_color(self):return "Blue"# 抽象部分:定義形狀
class Shape:def __init__(self, color: Color):self.color = colordef draw(self):passclass Circle(Shape):def __init__(self, color: Color, radius: int):super().__init__(color)self.radius = radiusdef draw(self):return f"Drawing Circle of radius {self.radius} with color {self.color.apply_color()}"class Rectangle(Shape):def __init__(self, color: Color, width: int, height: int):super().__init__(color)self.width = widthself.height = heightdef draw(self):return f"Drawing Rectangle of width {self.width} and height {self.height} with color {self.color.apply_color()}"# 測試橋接模式
if __name__ == "__main__":# 創建顏色實例red = RedColor()blue = BlueColor()# 創建形狀實例red_circle = Circle(red, 10)blue_rectangle = Rectangle(blue, 20, 15)print(red_circle.draw())      # 輸出:Drawing Circle of radius 10 with color Redprint(blue_rectangle.draw()) # 輸出:Drawing Rectangle of width 20 and height 15 with color Blue

4. 橋接模式的優缺點

優點

  1. 解耦抽象和實現
    抽象部分與實現部分可以獨立變化,增強系統的靈活性。

  2. 提高可擴展性
    可以輕松增加新的抽象部分或實現部分,而無需修改已有代碼。

  3. 符合開閉原則
    新增功能時,只需擴展新的類,而不需要修改現有代碼。

  4. 減少類的數量
    避免了多維度繼承導致的類爆炸問題。

缺點

  1. 復雜性增加
    系統需要引入額外的橋接接口和實現層,增加了代碼的復雜性。

  2. 過度設計
    對于簡單需求可能顯得冗余,不如直接使用繼承。


5. 橋接模式的應用場景

現實應用

  1. 圖形繪制系統
    如上述示例中的形狀與顏色的組合。

  2. 跨平臺應用
    一個程序需要適配不同平臺時,抽象部分定義通用接口,具體實現部分針對各個平臺實現。

  3. 數據庫訪問
    抽象部分定義通用的數據操作接口,具體實現部分可以是 MySQL、PostgreSQL、MongoDB 等不同數據庫的操作實現。

  4. 日志框架
    日志內容與日志存儲方式分離,方便擴展。


6. 總結

橋接模式通過將抽象與實現分離,使得系統的兩個維度可以獨立擴展。這種模式在需要跨維度組合的場景中尤為適用。通過橋接模式,我們可以有效地降低代碼的耦合度,提高系統的靈活性和可維護性。

核心要點

  1. 抽象部分與實現部分分離
  2. 避免多維度繼承引發的類爆炸問題
  3. 靈活擴展,符合開閉原則

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

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

相關文章

Linux 虛擬機與windows主機之間的文件傳輸--設置共享文件夾方式

Linux 虛擬機與windows主機之間的文件傳輸 設置共享文件夾方式 在虛擬機中打開終端查看是否已經新建完成,到文件夾中找到它看一下,這個位置就能存儲東西啦

關于linux網橋(Linux Bridge)的一些個人記錄

文章目錄 1. Linux Bridge簡述2. 網橋創建創建配置持久化在Debian/Ubuntu系統上:在CentOS/RHEL系統上: 啟用和驗證 3. 關于linux網橋不轉發ip幀的問題原因解決配置持久化 4. 查看網橋學習交換表手動添加或刪除條目添加條目刪除條目 配置靜態條目設置條目…

期末概率論總結提綱(僅適用于本校,看文中說明)

文章目錄 說明A選擇題1.硬幣2.兩個事件的關系 與或非3.概率和為14.概率密度 均勻分布5.聯合分布率求未知參數6.聯合分布率求未知參數7.什么是統計量(記憶即可)8.矩估計量9.117頁12題10.顯著水平阿爾法(背公式就完了) 判斷題11.事件…

Inno Setup制作安裝包,安裝給win加環境變量

加 ; 加環境變量,開啟,下面一行 ChangesEnvironmentyes 和 ; 加環境變量wbrj變量名,{app}\project\bin變量值,{app}\后接文件名,{app}表示安裝路徑。下面一行,{olddata};原來的值上拼接 Root: HKLM; Subkey: “SYSTEM\…

Golang學習筆記_23——error補充

Golang學習筆記_20——error Golang學習筆記_21——Reader Golang學習筆記_22——Reader示例 文章目錄 error補充1. 基本錯誤處理2. 自定義錯誤3. 錯誤類型判斷3.1 類型斷言3.2 類型選擇 4. panic && recover 源碼 error補充 1. 基本錯誤處理 在Go中,函數…

Python中的asyncio:高效的異步編程模型

隨著互聯網應用的快速發展,程序的響應性和處理效率成為衡量系統性能的重要指標。傳統的同步編程模型在面對高并發和IO密集型任務時,常常顯得捉襟見肘,難以滿足現代應用的需求。Python的asyncio庫作為一種高效的異步編程模型,為開發…

JavaScript -- 數組詳解(使用頻率高)【數組專題】

文章目錄 前言一、創建數組1.1 使用Array構造函數1.2 使用數組字面量表示法1.3 ES6語法轉換數組1.3.1 from( )用于將類數組結構轉換為數組實例1.3.2 of( )用于將一組參數轉換為數組實例 二、數組常用方法2.1 復制和填充2.1.1 copyWithin( )2.1.2 fill( ) 2.2 數組轉換2.2.1 toS…

操作系統之文件系統的基本概念

目錄 用戶和磁盤視角的文件 文件控制塊(FCB)和索引結點(inode) 文件的操作 創建文件(create系統調用) 寫文件(write系統調用) 讀文件(read系統調用) 重…

如何制作一份出色的公司介紹PPT?

制作一份公司介紹的PPT需要精心設計,以確保內容既專業又吸引人。以下是一個基本的框架和一些建議,幫助您創建一份有效的公司介紹PPT: PPT標題頁 標題:公司全稱(可使用公司Logo作為背景或嵌入標題中)副標題…

springboot項目部署至linux

1.修改pom.xml 確認是否有以下代碼&#xff0c;沒有請進行添加&#xff0c;mainClass改成你的啟動類 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…

vue.js 使用router-link替代a標簽實現高亮

在Vue.js中&#xff0c;可以使用<router-link>組件來替代<a>標簽實現高亮效果。<router-link>是Vue-Router提供的組件&#xff0c;用于路由導航。 首先&#xff0c;需要在Vue項目中安裝Vue-Router。可以使用以下命令安裝&#xff1a; npm install vue-rout…

FPGA隨記——時鐘時序一些基本知識

原文鏈接&#xff1a;跨時鐘域設計-CSDN博客 前言 CDC&#xff08;clock domain crossing&#xff09;檢查&#xff08;跨時鐘域的檢查&#xff09;是對電路設計中同步電路設計的檢查。非同步時鐘沒有固定的相位關系&#xff0c;這樣Setup/Hold不滿足而產生了亞穩態是無法避免…

實例解析網絡釣魚攻擊的幕后

網絡釣魚是通過大量發送聲稱來自于銀行或其他知名機構的欺騙性垃圾郵件&#xff0c;意圖引誘收信人給出敏感信息&#xff08;如用戶名、口令、帳號ID、ATM PIN碼或信用卡詳細信息&#xff09;的一種攻擊方式。最典型的網絡釣魚攻擊將收信人引誘到一個通過精心設計與目標組織的網…

STM32+WIFI獲取網絡時間+8位數碼管顯示+0.96OLED顯

資料下載地址&#xff1a;STM32WIFI獲取網絡時間8位數碼管顯示0.96OLED 1、項目介紹 主控芯片STM32C8T6 接線&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 數碼管使用&#xff1a;MAX7219 8位數碼管 Max7219_pinCLK PAout(5) Max7219_pinC…

1688平臺商品關鍵詞搜索的多樣性與Python爬蟲應用實踐

在當今這個信息化、數字化飛速發展的時代&#xff0c;電子商務平臺已經成為人們日常生活中不可或缺的一部分。而1688作為國內知名的B2B電商平臺&#xff0c;憑借其龐大的商品種類和豐富的供應鏈資源&#xff0c;為無數商家和消費者提供了便捷的交易渠道。除了廣受關注的女裝品類…

記錄將springboot的jar包和lib分離,使用docker-compose部署

本文講訴如何把jar里的lib依賴包獨立出來&#xff0c;方便更新服務時&#xff0c;縮小jar的體積&#xff0c;下面以若依的system服務為例&#xff0c;配置中的路徑請酌情修改&#xff0c;主要提供大致配置邏輯 第一步&#xff1a;修改項目的pom.xml&#xff0c;調整build的配…

如何解決Redis中的熱點key問題

Redis中的熱點Key問題是指某些特定的Key被頻繁訪問&#xff0c;導致Redis中某個節點&#xff08;或實例&#xff09;承擔過高的壓力&#xff0c;可能引發性能瓶頸&#xff0c;甚至若緩存承受不住服務壓力掛掉后&#xff0c;仍有大量請求時直接打到DB上&#xff0c;由于DB層相對…

單片機實現模式轉換

[任務] 要求通過單片機實現以下功能&#xff1a; 1.單片機有三種工作模式(定義全局變量MM表示模式&#xff0c;MM1&#xff0c;2&#xff0c;3表示三種不同的模式) LED控制模式 風扇控制模式 蜂鳴器控制模式 2.可以在某一個模式下通過拓展板KEY1按鍵控制設備 (按…

安卓OCR使用(Google ML Kit)

OCR是一個很常用的功能&#xff0c;Google ML Kit提供了OCR能力&#xff0c;用起來也很簡單&#xff0c;本文介紹一下使用方法。 1. 相關概念 名詞概念解釋TextBlock塊一個段落Line行一行文本Element元素單詞&#xff1b;對漢字來說&#xff0c;類似"開頭 (分隔符)中間&…

數據庫(3)--針對列的CRUD操作

1.Create 新增 語法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 創建一個學生表用于演示&#xff1a; create table if not exists student( id bigint comment 編號, name varchar(20) comment 姓名 ); 1.1直接增加…