橋接模式 (Bridge Pattern)

定義:

橋接模式(Bridge Pattern)是一種結構型設計模式,用于將抽象部分與其實現部分分離,使它們可以獨立地變化。這種模式通過創建一個橋接接口,將抽象類和其實現類解耦,使得修改或擴展獨立的抽象和實現變得更加容易。

在橋接模式中,通常涉及以下幾個核心組件:

  1. 抽象化(Abstraction)
    • 定義抽象類的接口。它保持一個指向實現化對象的引用,并且由子類實現這個接口。
  2. 精化抽象化(Refined Abstraction)
    • 擴展或細化由抽象化定義的接口。
  3. 實現化(Implementor)
    • 定義實現類的接口。這個接口并不一定要與抽象化的接口完全一致,事實上它們可以完全不同。一般來說,實現化接口提供了基本的操作,而抽象化則定義了基于這些操作的較高層次的操作。
  4. 具體實現化(Concrete Implementor)
    • 具體實現Implementor接口的類。
解決的問題:
  • 抽象和實現的耦合問題
    • 在傳統的繼承機制中,抽象和實現往往緊密耦合,這限制了它們的獨立變化和擴展。橋接模式通過分離抽象與實現使它們可以獨立發展。
  • 類層次爆炸問題
    • 當一個系統中既有多個維度的抽象,又有多個維度的實現時,如果使用繼承來擴展功能,很快會導致大量子類的產生,這種情況稱為“類層次爆炸”。橋接模式通過將抽象和實現分離,避免了這個問題。
  • 提高代碼的可擴展性
    • 在橋接模式中,由于抽象和實現是獨立的,所以增加新的抽象或者新的實現都不會影響到另一方。這使得系統更易于擴展和維護。
  • 動態切換實現
    • 由于抽象與實現是分離的,可以在運行時動態地切換實現,從而提供更大的靈活性。

總之,橋接模式通過建立一個橋梁,連接抽象層次和實現層次,使得兩者的變化可以獨立進行。這種模式在設計系統時非常有用,特別是當系統需要在多個維度上變化和擴展時。

使用場景:
  • 獨立變化的維度
    • 當你有兩個或多個獨立變化的維度(例如,抽象和實現),并且希望將它們的實現和接口分離開來,以便它們可以獨立地變化和擴展。
  • 運行時綁定具體實現
    • 當你需要在運行時切換不同的實現方法時。橋接模式通過抽象層持有實現層的引用,允許動態更改實現。
  • 避免類層次爆炸
    • 當一個類存在多個變化因素時,如果使用繼承會導致產生大量子類,橋接模式可以將這些變化因素分離成不同的類層次,減少類的數量。
  • 共享實現
    • 當多個對象共享實現細節,但又需要獨立于它們進行擴展時。橋接模式可以共享實現部分,同時允許客戶代碼獨立于它們變化。
  • 改變抽象和實現的擴展性
    • 當需要對抽象部分和實現部分分別進行擴展,而不對客戶產生影響時,橋接模式提供了良好的解決方案。
  • 跨平臺應用開發
    • 在需要開發跨平臺應用時,可以使用橋接模式來分離平臺間的差異和應用程序的核心業務。
示例代碼 1 - 概念實現:
// 抽象化角色
public abstract class Abstraction {protected Implementor implementor;protected Abstraction(Implementor implementor) {this.implementor = implementor;}public abstract void operation();
}// 具體抽象化角色
public class RefinedAbstraction extends Abstraction {protected RefinedAbstraction(Implementor implementor) {super(implementor);}@Overridepublic void operation() {implementor.operationImpl();}
}// 實現化角色
public interface Implementor {void operationImpl();
}// 具體實現化角色
public class ConcreteImplementorA implements Implementor {@Overridepublic void operationImpl() {System.out.println("ConcreteImplementorA operation.");}
}public class ConcreteImplementorB implements Implementor {@Overridepublic void operationImpl() {System.out.println("ConcreteImplementorB operation.");}
}
示例代碼 2 - 實際應用示例:

假設有一個設備管理系統,需要控制不同品牌的電視機和不同類型的遙控器。

// 設備接口(實現化角色)
public interface Device {void turnOn();void turnOff();void setChannel(int channel);
}// 遙控器抽象類(抽象化角色)
public abstract class RemoteControl {protected Device device;protected RemoteControl(Device device) {this.device = device;}public abstract void togglePower();
}// 具體遙控器(細化抽象化角色)
public class AdvancedRemoteControl extends RemoteControl {public AdvancedRemoteControl(Device device) {super(device);}@Overridepublic void togglePower() {// 實現切換電源的功能}public void mute() {// 實現靜音功能}
}// 具體設備實現(具體實現化角色)
public class TV implements Device {@Overridepublic void turnOn() {// 實現打開電視機}@Overridepublic void turnOff() {// 實現關閉電視機}@Overridepublic void setChannel(int channel) {// 實現切換頻道}
}
主要符合的設計原則:
  1. 開閉原則(Open-Closed Principle):
    • 橋接模式允許抽象部分和實現部分獨立變化,它們可以獨立擴展而無需修改原有代碼。這就意味著系統對于擴展是開放的,但對于修改是封閉的。
  2. 組合優于繼承(Composition over Inheritance):
    • 橋接模式通過組合關系(抽象部分包含實現部分的引用)而不是繼承關系來組織代碼。這樣的組合關系提供了比繼承更高的靈活性。
  3. 單一職責原則(Single Responsibility Principle):
    • 在橋接模式中,抽象和實現分離,每部分都有其單一的職責。抽象部分負責處理高層邏輯,而實現部分負責具體的平臺或實現細節。
  4. 最少知識原則(Principle of Least Knowledge):
    • 橋接模式讓具體的實現對使用它的抽象層透明,從而減少系統各部分之間的緊密耦合。
在JDK中的應用:
  • Java數據庫連接(JDBC):
    • JDBC API提供了一個很好的橋接模式例子。java.sql.DriverManager 類作為橋接器,連接Java應用與多種數據庫驅動之間的橋梁。驅動管理器本身不執行任何數據庫操作,它僅僅是通過指定的驅動程序來建立連接。不同的數據庫(如MySQL、Oracle、PostgreSQL等)提供了各自的實現,但對于Java應用來說,這些細節是透明的。
  • Java標準圖形界面(Swing):
    • 雖然Swing的設計更接近于組合模式,但在某些方面也可以看作是橋接模式的應用。例如,Swing中的渲染器(如 CellRenderer)和模型(如 TableModelTreeModel)之間的關系。這里,渲染器作為抽象部分,模型則是實現部分,二者通過接口相連接。
  • Java網絡API:
    • 在Java的網絡編程API中,如 java.net.Socketjava.net.ServerSocket 類,可以視為橋接模式的一個例子。這些類為網絡通信提供高層抽象,而實際的工作(如TCP/IP協議的細節)則由底層操作系統的實現來完成。
  • Java NIO:
    • Java新I/O(NIO)庫中的緩沖區(Buffer)類和通道(Channel)類之間的關系也可以看作是橋接模式的一種形式。緩沖區提供了數據的抽象表示,而通道則提供了對實際I/O操作的抽象。

雖然在JDK中這些例子并不總是被顯式標記為橋接模式的應用,但它們確實使用了橋接模式的核心理念:將抽象和實現分離開來,使得它們可以獨立地變化。

在Spring中的應用:
  • Spring框架的多數據源支持
    • 在Spring框架中處理數據庫時,可以配置和使用多種不同的數據源。這里,數據源配置和數據訪問對象(DAOs)可以看作是抽象和實現的分離。DAOs提供了與數據源交互的統一接口,而具體的數據源細節(如JDBC、JPA、Hibernate等)則在配置中定義,這與橋接模式的概念相似。
  • Spring MVC中的視圖解析器
    • 在Spring MVC中,ViewResolver 接口定義了解析視圖的機制,而具體的視圖解析器實現(如InternalResourceViewResolverFreeMarkerViewResolver等)則為不同類型的視圖提供支持。這種視圖解析機制也體現了橋接模式的思想。
  • Spring WebFlux的底層技術支持
    • Spring WebFlux框架為響應式編程提供支持,它可以基于不同的運行時環境(如Netty、Undertow、Servlet 3.1+容器等)。這里,WebFlux定義了一套統一的反應式編程模型(抽象),而具體的運行時環境(實現)則是可插拔的。

雖然這些例子并不是橋接模式的典型應用,但它們在設計上確實采用了橋接模式的核心思想:通過提供統一的接口(抽象)并將具體的實現細節(實現)分離出去,從而增加了系統的靈活性和可擴展性。


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

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

相關文章

改進YOLOv5 | C3模塊改動篇 | 輕量化設計 |骨干引入動態卷積|CondConv

???YOLOv5實戰寶典--星級指南:從入門到精通,您不可錯過的技巧 ??-- 聚焦于YOLO的 最新版本, 對頸部網絡改進、添加局部注意力、增加檢測頭部,實測漲點 ?? 深入淺出YOLOv5:我的專業筆記與技術總結 ??-- YOLOv5輕松上手, 適用技術小白,文章代碼齊全,僅需 …

信號功率放大器的工作原理和特點是什么

信號功率放大器是一種電子設備,用于將輸入信號的功率進行放大,以達到所需的輸出功率水平。它在各個領域中都有廣泛的應用,包括音頻放大器、射頻放大器、激光功率放大器等。下面將詳細介紹信號功率放大器的工作原理和特點。 工作原理&#xff…

Git使用基礎總結(從小白到新手版)

(??? ),Hello我是祐言QAQ我的博客主頁:C/C語言,數據結構,Linux基礎,ARM開發板,網絡編程等領域UP🌍快上🚘,一起學習,讓我們成為一個強大的攻城獅&#xff0…

只知道ECMAScript 2015(ES6),一篇匯總ECMAScript 2015~ECMAScript 2023新特性

前言 我們常說的ES6也就是ECMAScript 2015是在2015年6月發布的。這個版本引入了許多重要的語言特性和改進,對 JavaScript 進行了深刻的擴展和升級,ES6 是 JavaScript 語言的一個里程碑。所以有時也被稱為ES6。這是由于規范的發布年份與實際版本號之間的…

OpenAI“宮斗”新進展!Sam Altman將重返OpenAI擔任首席執行官 董事會成員改動

在經過激烈的五天討論和辯論之后,高調人工智能初創公司OpenAI宣布,其聯合創始人之一Sam Altman將回歸擔任首席執行官。這一決定是對上周Altman突然被解雇的回應,該決定引起了極大的關注和討論。 OpenAI表示,他們已經達成了與Altm…

德迅云安全-德迅衛士:保障您的主機安全

主機安全是指保證主機在數據存儲和處理的保密性、完整性、可用性,包括硬件、固件、系統軟件的自身安全,以及一系列附加的安全技術和安全管理措施。 為什么要主機安全? 服務器一旦被黑客入侵,個人和企業面臨以下安全風險&#xff…

張弛聲音變現課,如何為偶像劇配音?

在為偶像劇進行配音工作時,配音員應當捕捉劇中角色的年輕活力、浪漫的愛情故事以及輕快的生活節奏。偶像劇主要講述的是青春的愛戀、友誼和夢想追求,因此配音需要傳遞出劇中的真誠和活潑。為偶像劇配音可以考慮以下幾點建議: 鮮明活潑的聲音 …

如何判斷交流回饋老化測試負載是否合格?

交流回饋老化測試負載是用于模擬實際工作環境中設備運行狀態的測試工具,主要用于檢測設備的耐久性和穩定性。 負載性能:需要檢查負載的性能是否符合設計要求,這包括負載的功率、電流、電壓等參數是否在規定的范圍內,以及負載的工作…

【AI】行業消息精選和分析(11月23日)

今日動態 1、Sam Altman 重掌 CEO,OpenAI 權力斗爭正式「落幕」 2、重磅好消息:語音 ChatGPT 現已向全用戶開放 3、NVIDIA 與基因泰克合作,利用生成式 AI 加速藥物發現 4、 英偉達Q3營收同比增長206%至181億美元 黃仁勛:生成式AI時…

Zoho Bigin和標準版CRM有什么區別?

Zoho Bigin是Zoho公司推出的一款針對小微企業設計的CRM系統,它與Zoho CRM一脈相承,但更加輕量級,快速幫助小微企業實現數字化銷售。下面來說說,Zoho Bigin是什么?它適合哪些企業? 什么是Zoho Bigin&#x…

【c語言】重溫一下動態內存,int數組過大會造成棧錯誤

項目場景: 項目場景:互助群同學在刷題的過程中,遇到的一個題目,需要申請一個很大數組,于是這個同學就寫了int[1000000],其實這樣寫也沒有錯,可是運行后卻顯示棧錯誤。于是就找到我來請教,我想就…

從零開始的c語言日記day36——指針進階

一、什么是指針: 指針的概念:1.指針就是個變量,用來存放地址,地址唯一標識一塊內存空間。 ⒉指針的大小是固定的4/8個字節(32位平臺/64位平臺)。 指針是有類型,指針的類型決定了指針的-整數的步長,指針解引用操作的時候的權限。…

嵌入式面經-python相關問題

1、c\cpp\python 區別,各自優缺點? 2、python是怎么處理 深拷貝和淺拷貝的? 3、python的多線程 多進程 4、用過python哪些庫

玻璃加工ERP包含些模塊?玻璃加工ERP好用嗎

玻璃制品的類型多、規格不一、營銷策略靈活、銷售渠道廣泛、生產關聯業務環節。在當今這個市場競爭日益激烈的時代,如何有效整合各個業務環節,提升多部門協作效率,隨時進行數據分析等,是每個玻璃加工企業面臨的管理難題。 在數字…

【C語法學習】27 - 字符串轉換為數字

文章目錄 1 atoi()函數1.1 函數原型1.2 參數1.3 返回值1.4 轉換機制1.5 示例1.5.1 示例1 1 atoi()函數 1.1 函數原型 atoi():將str指向的字符串轉換為整數,函數原型如下: int atoi(const char *str);1.2 參數 atoi()函數只有一個參數str&…

docker部署paddleocr

內容僅供參考學習 歡迎朋友們V一起交流: zcxl7_7 環境 1. CentOS7 ?2. docker ?3. PaddleOCR2.5.2 1.準備 1. 首先準備好需要打包的項目 2. 在該項目中創建Dockerfile文件 touch Dockerfile2. 編寫Dockerfile # 從Python 3.8的官方鏡像中創建(pyt…

建立簡單的客戶端-服務端通信系統

本文介紹如何使用C編寫一個基本的客戶端-服務端通信系統。通過這個例子&#xff0c;你將學到如何建立TCP連接、發送和接收消息&#xff0c;以及如何處理多個客戶端連接。 客戶端代碼&#xff1a; #include <stdio.h> // 標準輸入輸出庫&#xff0c;提供基本的輸入…

matlab使用scatter函數畫圖時報錯“數組索引必須為正整數或邏輯值”解決辦法

一、背景 在使用matlab的scatter函數畫圖時報錯“數組索引必須為正整數或邏輯值”。 scatter函數說明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置創建一個包含圓形標記的散點圖。 二、解決辦法 如果使用scatter函數時報上述錯誤&#xff0c;嘗試將連續函數先轉換為函…

ubuntu編譯sqlite3并使用

SQLite3是一種輕量級的關系型數據庫管理系統&#xff0c;它是在C語言基礎上實現的。SQLite3具有許多優點&#xff0c;例如&#xff1a; 1.靈活&#xff1a;它可以在多種操作系統上運行&#xff0c;并且可以將多個數據庫文件合并成一個文件。 2.易于使用&#xff1a;SQLite3使用…

基于爬行動物算法優化概率神經網絡PNN的分類預測 - 附代碼

基于爬行動物算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于爬行動物算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于爬行動物優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神…