設計模式--橋接模式詳解

橋接模式(bridge pattern)

  • 橋接模式時將抽象部分與它的實現部分分離,使他們可以獨立的變化。它是一種對象結構型模式,又稱為柄體(Handle and Body)模式或者接口(interface)模式(組合

    以前使用的多層繼承結構,耦合性太強,且違反了單一職責原則,如下圖

如果以這種結構去設計程序的架構的話,拓展性會有很大的問題。

比如如果想增加一個新的電腦品牌,需要寫三個類,如果想增加一個電子產品,依舊要寫三個類,非常繁瑣,

違反了單一職責原則:每個類只負責一個東西,每個類只有一個功能。

而從上圖看出,每一個類的最終實現類都負責了不止一個事務,如聯想臺式:聯想是品牌,而臺式是電腦的品種。每個類拆分的不夠徹底

分析:這個場景有兩個變化的維度:品牌,類型

這里面的每個節點就是上面結構圖中的最終實現類。

將結構看成這樣,那我們在新增品牌的時候,只需要在x軸增加就好了,在新增類型的時候,只需要在y軸增加就好了,只要想辦法通過一個鏈接點把它連起來,就可以形成一個新的產品。

而這,就是橋接模式,

我們需要將原來的事物高度抽象,只要超過兩個場景變換維度的事物,就將其抽象出來,這個類型寫一個抽象類,品牌寫一個抽象類,通過一座橋將其連接起來,就可以構建產品

使用橋接模式來重寫該事務

首先創建品牌接口,

?package com.lyc.bridge;// 品牌,抽象類或者接口public interface Brand {void info();}

再寫品牌實現類

?package com.lyc.bridge;//聯想品牌public class Lenovo implements Brand{@Overridepublic void info() {System.out.print("聯想品牌");}}

?package com.lyc.bridge;//蘋果品牌public class Apple implements Brand{@Overridepublic void info() {System.out.print("Apple");}}

開始寫電腦橋接類,在類中建立連接品牌的橋(即定義品牌屬性,再寫品牌構造器,在寫電腦實現類的時候,無需再連接品牌類)這樣大大減少了這兩個事物的耦合度。

?package com.lyc.bridge;//抽象的電腦類//橋接類 用于將電腦與品牌進行關聯public ?class Computer {//組合,品牌 橋接模式,橋用于鏈接,與適配器模式不同protected Brand brand; //子類在使用的時候可以隨意設置品牌public Computer(Brand brand){this.brand = brand;}public void info(){//自帶品牌brand.info();}}

再寫電腦實現類

?package com.lyc.bridge;?public class Laptop extends Computer{public Laptop(Brand brand) {super(brand);}?@Overridepublic void info() {super.info();System.out.print("筆記本");}}

?package com.lyc.bridge;?public class Desktop extends Computer{public Desktop(Brand brand) {super(brand);}public void info(){super.info();System.out.print("臺式機");}}

最后進行測試:

?package com.lyc.bridge;?public class Test {public static void main(String[] args) {//蘋果筆記本Computer computer = new Laptop(new Apple());computer.info();System.out.println("");//聯盟臺式機Desktop desktop = new Desktop(new Lenovo());desktop.info();}}

效果:

這樣就品牌與類型相互分離了

注意事項:

  1. 抽象部分與實現部分需要分離,不能有過多的耦合

  2. 橋接模式適用于多個維度的變化,如果維度較少,使用繼承更加簡單

  3. 橋接模式會增加系統復雜度,謹慎使用

類圖:

橋接模式

  • 好處分析:

    • 橋接模式偶爾類似于多繼承方案,但是多繼承方案違背了類的單一職責原則,復用性較差,類的個數也非常多,橋接模式是比多繼承方案更好的解決方法,極大地減少了子類的個數,從而降低管理和維護的成本

    • 橋接模式提高了系統的可擴容性,在兩個變化維度任意擴展一個維度,都不需要修改原有模式,符合開閉原則,就像一座橋,可以把兩個變化的維度連接起來。

  • 缺點分析:

    • 橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程

    • 橋接模式要求正確識別出系統中兩個獨立變化的維度,因此適用范圍具有一定的局限性

  • 最佳實踐

    • 如果一個系統需要在構建的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,可以通過橋接模式使他們在抽象層建立一個關聯關系,抽象化角色和實現化角色可以以繼承的方式獨立擴展而互不影響,在程序運行時可以將動態將一個抽象化子類的對象和一個實現化子類的對象進行組合,及系統需要對抽象化角色和現實化角色進行動態耦合

    • 一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展

    • 雖然在系統中使用擴展是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設計需求需要獨立管理這兩者,對于那些不希望使用繼承或者因為多層次繼承導致系統類的個數急速增加的系統,橋接模式非常適合

  • 使用實例

    • Java語言通過Java虛擬機實現了平臺的無關性

    • AWT中的Peer架構:在同一個頁面中,在window中與在Liunx中的畫面不一致,代碼一致,效果不同

    • JDBC驅動程序也是橋接模式的應用之一,JDBC本身就是一個抽象角色,他可以連接MySQL,也可以鏈接Oracle,與具體實現的角色進行分離

拓展:橋接模式+適配器模式?

橋接模式可以用在系統創建之初,就是類似于兩個相關維度,如果在后面添加和前兩個基本無關的維度,可以使用適配器模式將其連接起來。

我們應該將前面學習過的設計模式,嘗試將其應用到自身代碼中,加強理解!

希望對大家有所幫助!

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

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

相關文章

關于 live555延遲優化之緩存區優化“StreamParser::afterGettingBytes() warning: read”” 的解決方法

若該文為原創文章,轉載請注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146354088 長沙紅胖子Qt(長沙創微智科)博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV…

Vite 動態導入靜態資源與自動依賴發現實戰解析

一、Vite 動態導入靜態資源的實現方案 在 Vite 中,動態加載圖片、JSON 等靜態資源是高頻需求,但動態路徑拼接可能導致構建失敗或資源未識別。以下結合示例代碼,分析三種實現方案: 1. 方案一:new URL 動態路徑轉換 通…

在matlab中使用UAV123官方toolkits測試自己的數據集

一、前言 最近需要將自己的跟蹤代碼在自己拍攝的數據集上進行測試,這里我選擇使用 UAV123 官方 toolkits 進行配置。首先需要搞清楚這部分代碼是如何運行的,精度圖和成功率圖是如何繪制出來的,然后再將自己的數據集加進去進行測試。 二、UA…

9.idea中創建springboot項目_jdk1.8

9. idea中創建springboot項目_jdk1.8 步驟 1:打開 IntelliJ IDEA 并創建新項目 啟動 IntelliJ IDEA。在歡迎界面,點擊 New Project(或通過菜單欄 File > New > Project)。 步驟 2:選擇 Maven 項目類型 在左側…

SpringAI實現AI應用-搭建知識庫

SpringAI實戰鏈接 1.SpringAl實現AI應用-快速搭建-CSDN博客 2.SpringAI實現AI應用-搭建知識庫-CSDN博客 概述 想要使用SpringAI搭建知識庫,就要使用SpringAI中的TikaDocumentReader,它屬于ETL(提取、轉換、加載)框架中的提取&…

內網服務器映射到公網上怎么做?網絡將內網服務轉換到公網上

如何將內網映射到公網?本地局域網的網絡下部署的內網服務地址轉換到公網上連接訪問是大家比較關注的問題,特別是在無公網IP使用的情況下,很多人不知道怎么做。 在沒有公網 IP 的情況下,要將內網映射到公網,以便外網能…

intellij idea最新版git開啟Local Changes

習慣了在idea的git插件里,查看項目已修改的文件,但是新版idea默認不展示了,用起來很難受。 參考網上教程開啟方法如下: 1. 確保安裝Git Modal Commit Interface插件并開啟該插件 2. 在Advanced Settings開啟Use Modal Commit In…

??智能制造中的預測性維護:基于深度學習的設備故障預測??

智能制造中的預測性維護:基于深度學習的設備故障預測 引言 在智能制造領域,設備突發故障可能導致巨大的經濟損失。傳統維護方式(如定期檢修或事后維修)往往效率低下且成本高昂。預測性維護(Predictive Maintenance, PdM)通過實時監測設備狀態并預測潛在故障,能夠顯著減…

DeepSeek+即夢:AI視頻創作從0到1全突破

目錄 一、開啟 AI 視頻創作大門:前期準備1.1 注冊與登錄1.2 熟悉工具界面1.3 硬件與網絡要求 二、用 DeepSeek 構思視頻腳本2.1 明確創作主題與目標2.2 編寫優質提示詞2.3 生成并優化腳本 三、即夢 AI 實現畫面生成3.1 文生圖基礎操作3.2 調整參數提升畫質3.3 保持人…

初始化列表詳解

1.類中包含以下成員,必須放在初始化列表位置進行初始化: 1. 引用成員變量 2.const成員變量 3. 自定義類型成員(且該類沒有默認構造函數時 ) 2. 成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后次序無關…

基于建造者模式的信號量與理解建造者模式

信號量是什么? AI解釋:信號量(Semaphore)是操作系統中用于 進程同步與互斥 的經典工具,由荷蘭計算機科學家 Edsger Dijkstra 在 1965 年提出。它本質上是一個 非負整數變量,通過原子操作(P 操作…

開閉原則(OCP)

非常棒的問題!🔍 開閉原則(OCP, Open/Closed Principle)是軟件設計的核心原則之一,下面我將從定義、意義、優劣分析、Python示例和結構圖五個方面完整解析給你。 🧠 什么是開閉原則? 開閉原則&a…

python數據分析(七):Pandas 數據變形與重塑

Pandas 數據變形與重塑全面指南 1. 引言 在數據分析過程中,我們經常需要將數據從一種結構轉換為另一種結構,以適應不同的分析需求。Pandas 提供了豐富的數據變形與重塑功能,包括旋轉(pivot)、堆疊(stack)、融合(melt)等多種操作。本文將詳細…

Android學習總結之jetpack組件間的聯系

在傳統安卓開發中,UI 組件(Activity/Fragment)常面臨三個核心問題: 生命周期混亂:手動管理 UI 與數據的綁定 / 解綁,易導致內存泄漏(如 Activity 銷毀后回調仍在觸發)。數據斷層&am…

C++初階:類和對象(二)

大家好,我是小卡皮巴拉 文章目錄 目錄 一.運算符重載 1.1 基本概念 定義 參數規則 特性 選擇原則 重載要點 二.類的默認成員函數 2.1 構造函數 構造函數的特點 2.2 析構函數 析構函數的特點 2.3 拷貝構造函數 拷貝構造的特點 2.4 拷貝賦值運算符重…

【c++】【STL】priority_queue詳解

目錄 priority_queue的作用priority_queue的接口構造函數emptysizetoppushpopswap priority_queue的實現仿函數(函數對象)是什么?向上調整算法(adjustup)向下調整算法(adjustdown)迭代器構造pus…

測試——用例篇

目錄 1. 測試用例 1.1 概念 2. 設計測試用例的萬能公式 2.1 常規思考逆向思維發散性思維 2.2 萬能公式 3. 設計測試用例例的方法 3.1 基于需求的設計方法 ?編輯 3.2 具體的設計方法 3.2.1 等價類 3.2.2 邊界值 3.2.3 正交法 3.2.4 判定表法 3.2.5 場景法 3.2.6…

銷售總監求職簡歷模板

模板信息 簡歷范文名稱:銷售總監求職簡歷模板,所屬行業:其他 | 職位,模板編號:KREUNY 專業的個人簡歷模板,邏輯清晰,排版簡潔美觀,讓你的個人簡歷顯得更專業,找到好工作…

AE腳本 關鍵幀緩入緩出曲線調節工具 Flow v1.5.0 Win/Mac

Flow是一個非常好用的After Effects腳本,它可以讓你更加輕松自如地調整關鍵幀的速度曲線,無需觸碰老舊復雜的圖形編輯器。 AE腳本介紹 Flow為After Effects帶來了一個簡潔的界面,使自定義動畫曲線變得十分容易,無需深入研究速度和影響力這些讓人困惑的概念 - 只需繪制一個曲線…

ACGRIME:用于全局優化和特征選擇的自適應混沌高斯RIME優化器,附完整版免費代碼

自然現象中,軟冰的形成過程由 Set al. [42] 提出,軟冰是空氣中的過冷水滴在接觸固體物體并凍結時形成的。這種現象發生在特定的氣候條件下,當水蒸氣尚未凝結時,導致冰覆蓋的表面呈現出獨特的樹枝狀和葉子狀景觀。它在軟冰的生長和…