23種設計模式-橋接(Bridge)設計模式

橋接設計模式

  • 🚩什么是橋接設計模式?
  • 🚩橋接設計模式的特點
  • 🚩橋接設計模式的結構
  • 🚩橋接設計模式的優缺點
  • 🚩橋接設計模式的Java實現
  • 🚩代碼總結
  • 🚩總結

🚩什么是橋接設計模式?

橋接模式(Bridge Pattern)結構型設計模式,它將 抽象部分實現部分 分離,使它們可以 獨立變化。橋接模式通過 組合 而不是繼承來實現抽象與實現的解耦。

使用場景

  • 當需要 避免抽象與實現之間的永久綁定 時。

  • 抽象部分實現部分 都需要 獨立擴展 時。

  • 當需要 在運行時切換實現 時。

🚩橋接設計模式的特點

  • 分離抽象與實現:橋接模式將抽象部分與實現部分分離,使它們可以獨立變化。

  • 靈活性:抽象部分和實現部分可以獨立擴展,互不影響。

  • 可擴展性:新增抽象或實現時,無需修改現有代碼。

  • 解耦:通過組合關系替代繼承關系,降低系統的耦合度。

🚩橋接設計模式的結構

橋接模式主要包含以下部分:

  • Abstraction(抽象部分):定義抽象接口,并維護一個對 實現部分 的引用。

  • RefinedAbstraction(擴展抽象部分):對抽象部分進行擴展,提供更多的功能。

  • Implementor(實現部分接口):定義實現部分的接口,供抽象部分調用。

  • ConcreteImplementor(具體實現部分):實現 Implementor 接口,提供具體的實現。

🚩橋接設計模式的優缺點

? 優點

  • 分離抽象與實現:抽象部分和實現部分可以獨立變化,互不影響。

  • 靈活性:可以在運行時動態切換實現。

  • 可擴展性:新增抽象或實現時,無需修改現有代碼。

  • 解耦:通過組合關系替代繼承關系,降低系統的耦合度。

? 缺點

  • 增加復雜性:橋接模式引入了更多的類和對象,增加了系統的復雜性。

  • 設計難度:需要正確識別抽象部分和實現部分,設計難度較高。

🚩橋接設計模式的Java實現

代碼地址:GitHub

  • 首先創建實現部分接口Color,定義方法 OperationImp()
/*** @author hanson.huang* @version V1.0* @InterfaceName Color* @Description 實現部分接口 Color* @date 2025/3/24 10:46**/
public interface Color {public void OperationImp(String name);
}
  • 創建 抽象產品類Product,定義抽象方法 Operation(),并維護一個對 接口Color 的引用。
/*** @author hanson.huang* @version V1.0* @ClassName Product* @Description 產品抽象類* @date 2025/3/24 10:40**/
public abstract class Product {private String name;protected Color color;public void setName(String name) {this.name = name;}public String getName() {return name;}public void setColor(Color color) {this.color = color;}public abstract void Operation();
}
  • 創建 擴展抽象部分 ProductA,實現 Operation() 方法,調用 實現部分 的方法。
/*** @author hanson.huang* @version V1.0* @ClassName ProductA* @Description 擴展抽象部分 ProductA* @date 2025/3/24 10:48**/
public class ProductA extends Product {@Overridepublic void Operation() {color.OperationImp(this.getName());}
}
  • 創建 具體實現部分 Red 和 Blue,分別實現 OperationImp() 方法。

    • Red
    /*** @author hanson.huang* @version V1.0* @ClassName Red* @Description 具體實現部分 Red* @date 2025/3/24 10:49**/
    public class Red implements Color {@Overridepublic void OperationImp(String name) {System.out.println(name + ":紅色");}
    }
    
    • Blue
    /*** @author hanson.huang* @version V1.0* @ClassName Blue* @Description 具體實現部分 Blue* @date 2025/3/24 10:49**/
    public class Blue implements Color {@Overridepublic void OperationImp(String name) {System.out.println(name + ":藍色");}
    }
    
  • 測試橋接模式

/*** @author hanson.huang* @version V1.0* @ClassName BridgePattern* @Description 測試橋接模式* @date 2025/3/24 10:59**/
public class BridgePattern {public static void main(String[] args) {Product productA1 = new ProductA();Product productA2 = new ProductA();Red red = new Red();productA1.setName("產品A1");productA1.setColor(red);productA1.Operation();Blue blue = new Blue();productA2.setName("產品A2");productA2.setColor(blue);productA2.Operation();}
}

📌 運行結果

在這里插入圖片描述

🚩代碼總結

  • 抽象部分 Product 定義抽象方法 Operation(),并維護一個對 實現部分 Color 的引用。

  • 擴展抽象部分ProductA實現 Operation() 方法,調用 實現部分 的方法。

  • 實現部分接口Color定義方法 OperationImp()

  • 具體實現部分 RedBlue 分別實現 OperationImp() 方法。

🚩總結

  • 橋接模式(Bridge Pattern)抽象部分實現部分 分離,使它們可以 獨立變化

  • 適用于 避免抽象與實現之間的永久綁定獨立擴展抽象與實現在運行時切換實現 的場景。

  • Java 實現 需要 定義抽象部分實現部分接口 以及 具體實現部分,并通過組合關系將兩者連接起來。

? 適用場景:

  • 需要 避免抽象與實現之間的永久綁定 時。

  • 需要 獨立擴展抽象與實現 時。

  • 需要 在運行時切換實現 時。

創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??

在這里插入圖片描述

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

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

相關文章

python:music21 構建 LSTM+GAN 模型生成爵士風格音樂

keras_lstm_gan_midi.py 這是一個結合 LSTM 和 GAN 生成爵士風格音樂的完整Python腳本。這個實現包含音樂特征提取、對抗訓練機制和MIDI生成功能: import numpy as np from music21 import converter, instrument, note, chord, stream from tensorflow.keras.mode…

go:前后端分離

1.前端代碼 新建一個前端文件夾,在該文件夾下新建一個.html文件,寫入自己的html代碼。 前端搞定。 2.后端代碼 其核心是掛載路由接受前端傳來的數據核心代碼如下: func main() { // 服務運行提示 fmt.Println("go web server is runn…

大數據學習(86)-Zookeeper去中心化調度

🍋🍋大數據學習🍋🍋 🔥系列專欄: 👑哲學語錄: 用力所能及,改變世界。 💖如果覺得博主的文章還不錯的話,請點贊👍收藏??留言📝支持一…

JetsonNano —— 4、Windows下對JetsonNano板卡燒錄刷機Ubuntu20.04版本(官方教程)

介紹 NVIDIA Jetson Nano? 開發者套件是一款面向創客、學習者和開發人員的小型 AI 計算機。按照這個簡短的指南,你就可以開始構建實用的 AI 應用程序、酷炫的 AI 機器人等了。 燒錄刷機 1、下載 Jetson Nano開發者套件SD卡映像 解壓出.img文件并記下它在計算機上的…

HTML5 拖放(Drag and Drop)學習筆記

一、HTML5 拖放簡介 HTML5 拖放(Drag and Drop)是HTML5標準的一部分,允許用戶抓取一個對象并將其拖動到另一個位置。拖放功能在現代網頁中非常常見,例如文件上傳、任務管理、布局調整等場景。 HTML5 拖放功能支持以下瀏覽器&…

文件I/O--C++的文件操作

一、打開文件&#xff0c;從文件中讀取、寫入文件 從文件中讀取數據&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以這句可以省略&#xff0c;現在不能了 using namespace std;i…

Redis GEO 命令詳解:輕松實現“附近的人“功能

目錄 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令詳解 命令應用示例 添加地點信息 查詢兩地距離 查詢附近的城市 實現"查找附近的人"功能 功能需求與實現思路 基本需求 實現思路 命令實現方案 存儲用戶位置 查詢附近的用戶 Java代碼實…

C語言貪吃蛇實現

When the night gets dark,remember that the Sun is also a star. 當夜幕降臨時&#xff0c;請記住太陽也是一顆星星。 ————《去月球海灘篇》 目錄 文章目錄 一、《貪吃蛇》游戲介紹 二、WIN32部分接口簡單介紹 2.1 控制臺窗口大小設置 2.2 命令行窗口的名稱的變更 2…

NIO入門

IO和NIO的區別&#xff1a; IO&#xff1a;通過流處理數據&#xff0c;僅支持阻塞IO。 核心組件&#xff1a;InputStream /OutputStream用于字節的讀寫&#xff0c;Reader / Writer&#xff1a;用于字符流的讀寫。讀取過程中無法被中斷&#xff0c;是阻塞式IO。 NIO:通過管道處…

基于vue.js開發的家庭裝修管理系統開發與設計(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 本家庭裝修管理系統采用B/S架構&#xff0c;數據庫是MySQL&#xff0c;網站的搭建與開發采用了先進的Node.js語言進行編寫&#xff0c;使用了VUE框架。該系統從兩個對象&#xff1a;由管理員和用戶來對系統進行設計構建。用戶的功能包括&#xff1a;注冊、登錄、瀏覽首頁…

OpenCV圖像拼接(5)圖像拼接模塊的用于創建權重圖函數createWeightMap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 庫中用于圖像拼接模塊的一個函數&#xff0c;主要用于創建權重圖。這個權重圖在圖像拼接過程中扮演著重…

LangGraph 怎么控制遞歸次數

這一節我們講講langgraph圖的遞歸限制 Recursion Limit&#xff0c;遞歸限制設置了圖在單次執行過程中可以執行的最大超級步驟數。一旦達到該限制&#xff0c;LangGraph 將引發 GraphRecursionError 錯誤。默認情況下&#xff0c;此值設置為 25 步。遞歸限制可以在運行時為任何…

08-項目中不可控的任務如何安排和驗收

項目中有時會有一些任務的時間是不可控的&#xff0c;不可控的原因在于該工作完全受制于他人。意思就是如果其他人沒有做好&#xff0c;比如前后端同步開發&#xff0c;前端通常可能會快一些&#xff0c;然后要等后端提供接口&#xff0c;這個時候聯調工作是沒辦法開展的&#…

【Git】git cherry-pick(將某個分支的 commit 改動復制到當前分支)

文章目錄 ?一、基礎用法1.1、?應用單個提交1.2、?應用多個非連續提交1.3、?應用多個連續提交 ?二、高級用法?2.1、沖突處理?2.2、放棄操作?2.3、?不自動提交2.4、應用分支的最新提交 ?一、基礎用法 1.1、?應用單個提交 使用提交的哈希值&#xff08;可通過 git lo…

Milvus WeightedRanker 對比 RRF 重排機制

省流:優先選擇WeightedRanker 以rag為例,優先選擇bm25全文檢索,其次選擇向量檢索 Milvus混合搜索中的重排機制 Milvus通過hybrid_search() API啟用混合搜索功能&#xff0c;結合復雜的重排策略來優化多個AnnSearchRequest實例的搜索結果。本主題涵蓋了重排過程&#xff0c;…

C++手撕共享指針、多線程交替、LRU緩存

1. 共享指針 #include <atomic> #include <iostream>template <typename T> class sharedptr { private:T *ptr;std::atomic<size_t> *count;public:sharedptr(T *p) : ptr(p), count(new std::atomic<size_t>(1)) {}sharedptr(const sharedptr…

新版 eslintrc 文件棄用 .eslintignore已棄用 替代方案

1.進入eslint.config.mjs文件 2.import { defineConfig, globalIgnores } from "eslint/config"; 引入globalIgnores 3.配置 defineConfig([ ... globalIgnores([ "config/*", ".husky", ".local", "public/*", ".…

基于ngnix配置本地代理到對應服務器

遇到的問題&#xff1a;服務器可以訪問到的地址&#xff0c;我本地代碼無法訪問到 在服務器上裝好nginx&#xff0c;在nginx配置文件nginx.conf中配置本地想要鏈接對應的服務器端口信息 server {listen 8101;location / {proxy_http_version 1.1;proxy_set_header Upgrade $h…

Go 語言 fmt 模塊的完整方法詳解及示例

以下是 Go 語言 fmt 模塊的完整方法詳解及示例&#xff0c;涵蓋所有核心功能&#xff1a; 一、輸出函數 將數據寫入標準輸出、文件或字符串。 1. Print / Println / Printf 功能 Print: 寫入標準輸出&#xff0c;不換行。Println: 寫入標準輸出并換行。Printf: 格式化寫入標…

在K8S中使用ArgoCD做持續部署

一、了解argocd ArgoCD是一個基于Kubernetes的GitOps持續交付工具&#xff0c;應用的部署和更新都可以在Git倉庫上同步實現&#xff0c;并自帶一個可視化界面。本文介紹如何使用GitArgocd方式來實現在k8s中部署和更新應用服務。關于ci這一塊這里不多介紹。主要講解argocd如何實…