23种设计模式——桥接模式 (Bridge Pattern)详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——桥接模式 (Bridge Pattern)
📚 ** ps **  :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 介绍

三. 模式结构

四. 代码示例

五. 使用桥接模式的原因

六.  桥接模式的优缺点

1. 优点

2. 缺点:

七. 适用场景

八. 与其他模式的区别

九. 实际应用场景

十. 总结


一. 背景

桥接模式......不仅仅名字听着陌生,在看一些比较复杂的示例代码的时候也是一脸懵。后来仔细看看,终于有了思路——桥接模式其实就是把代码中需要变的地方换成抽象或者接口,并把它作为参数传入即可。桥接模式有两个地方要变(抽象与实现),于是代码就有两个地方用接口或者抽象!


二. 介绍

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。桥接模式通过组合关系代替继承关系,从而降低抽象和实现这两个可变维度的耦合度。


三. 模式结构

桥接模式包含以下主要角色:

  1. 抽象化(Abstraction)​​:定义抽象接口,维护对实现化对象的引用
  2. 扩展抽象化(Refined Abstraction)​​:扩展抽象化定义的接口
  3. 实现化(Implementor)​​:定义实现类的接口
  4. 具体实现化(Concrete Implementor)​​:实现实现化接口

四. 代码示例

实现一个图形绘制系统,支持多种形状和多种颜色(形状和颜色要可扩展)。

实现代码:

// 实现化接口:颜色
interface Color {void applyColor();
}// 具体实现化:红色
class Red implements Color {@Overridepublic void applyColor() {System.out.println("应用红色");}
}// 具体实现化:蓝色
class Blue implements Color {@Overridepublic void applyColor() {System.out.println("应用蓝色");}
}// 抽象化:形状
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw();
}// 扩展抽象化:圆形
class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("绘制圆形,");color.applyColor();}
}// 扩展抽象化:方形
class Square extends Shape {public Square(Color color) {super(color);}@Overridevoid draw() {System.out.print("绘制方形,");color.applyColor();}
}// 客户端代码
public class BridgePatternDemo {public static void main(String[] args) {// 创建红色圆形Shape redCircle = new Circle(new Red());redCircle.draw();// 创建蓝色方形Shape blueSquare = new Square(new Blue());blueSquare.draw();// 创建蓝色圆形Shape blueCircle = new Circle(new Blue());blueCircle.draw();}
}

通过上面的实现,我们就可以进一步扩展系统,比如添加更多形状(三角形)或颜色(绿色)而不影响现有代码。


五. 使用桥接模式的原因

通过上面的案例,我们就很好理解使用桥接模式的原因了:
解耦抽象和实现:将抽象部分和实现部分分离,使它们可以独立变化
提高可扩展性:可以独立地扩展抽象部分和实现部分
符合开闭原则:对扩展开放,对修改关闭
隐藏实现细节:客户端不需要知道实现的细节


六.  桥接模式的优缺点

1. 优点

分离接口和实现:抽象和实现可以独立扩展
提高可扩展性:可以独立地扩展抽象部分和实现部分
符合开闭原则:对扩展开放,对修改关闭
隐藏实现细节:客户端不需要知道实现的细节
减少子类数量:避免了多重继承导致的类爆炸问题

2. 缺点:

增加系统复杂度:需要正确识别出系统中两个独立变化的维度
设计难度增加:需要预先识别出系统中的抽象和实现部分


七. 适用场景

  • 不希望在抽象和实现部分之间有固定的绑定关系:比如在程序运行时实现部分应可以被子类化
  • 类的抽象以及其实现都应该可以通过生成子类的方法加以扩充
  • 对一个抽象的实现部分的修改应对客户不产生影响
  • 想在多个对象间共享实现,但同时要求客户并不知道
  • 想通过继承或组合方式,在多个抽象和实现之间进行组合

八. 与其他模式的区别

  • 与适配器模式:适配器模式是后期为了兼容而做的补救措施,桥接模式是前期设计时的架构选择
  • 与装饰器模式:装饰器模式是为了增加功能,桥接模式是为了分离抽象和实现
  • 与策略模式:策略模式关注算法的替换,桥接模式关注抽象和实现的分离

九. 实际应用场景

图形渲染系统:不同的图形(圆形、矩形)可以在不同的平台(Windows、Linux)上渲染
数据库驱动:同一套数据库操作接口可以适配不同的数据库(MySQL、Oracle、PostgreSQL)
消息发送系统:不同类型的消息(邮件、短信)可以通过不同的渠道(邮件服务器、短信网关)发送
游戏开发:不同的游戏角色可以在不同的平台上运行


十. 总结

桥接模式是一种非常有用的结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立变化。这种模式特别适用于需要在多个维度上扩展的系统,能够有效避免类的爆炸性增长,提高系统的灵活性和可维护性。
在实际开发中,当我们发现系统中存在多个变化维度,且这些维度需要独立变化时,就可以考虑使用桥接模式。通过合理运用桥接模式,可以让我们的代码更加灵活、可扩展,并且符合面向对象设计原则。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96023.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫实战:研究Axes Grid模块,构建旅游平台酒店数据采集和分析系统

1. 引言 1.1 研究背景 随着互联网技术的飞速发展,全球数据总量呈现指数级增长。据国际数据公司(IDC)预测,到 2025 年全球数据圈将达到 175ZB,其中非结构化数据占比超过 80%。这些数据广泛分布于各类网站平台,包含着用户行为、市场趋势、产品特征等丰富信息。如何高效获…

光照边疆平台|面向边疆地区的现代化内容与信息服务系统

光照边疆平台|面向边疆地区的现代化内容与信息服务系统聚焦“边疆资讯 边疆风光 用户互动 后台可视化管控”的高颜值内容平台,适合展示、传播与运营边疆主题内容。系统定位与价值 主题聚焦:以“边疆”为核心,统一内容语义与视觉…

删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素

📝 题目:移除元素题目描述: 给定数组和值val,原地移除所有等于val的元素,返回新长度。例子: nums [3,2,2,3], val 3 → nums [2,2,_,_], return 2🔥 暴力法思路:暴力法想法&#…

10 【C++】泛型编程

文章目录前言泛型编程(模板)1. 函数模板1.1 函数模板格式1.2 函数模板的实例化隐式实例化显式指定模板参数实例化1.3 函数模板实例化的原理1.4 模板参数的匹配原则2. 类模板2.1 类模板的格式2.2 类模板的实例化2.3 类模板实例化的原理2.4 类模板的匹配原…

【基于YOLO和Web的交通工具识别系统】

系统功能 视频检测:对输入的视频流进行实时或离线分析,自动识别视频中出现的交通工具(如飞机、自行车等)及行人,输出包含目标类别、位置等信息的检测结果。摄像检测:通过连接摄像头设备,对实时…

Python进程,线程

目录 一、多任务 1.1定义 1.2具体体现 1.3并发和并行 1.3.1并发操作 1.3.2并行操作 1.3.3对比 二、进程 2.1概念 2.2特点 2.3进程状态 2.4多进程 2.5多进程实现 2.6进程锁 三、线程 3.1概念 3.2特点 3.3适用场景 3.4多线程实现 四、对比 4.1关系对⽐ 4.2区…

【Element Plus 表单组件样式统一 CSS 文字特效实现指南】

Element Plus 表单组件样式统一 & CSS 文字特效实现指南 前言 在使用 Element Plus 组件库开发表单页面时,我们遇到了一个看似简单却很有趣的问题:el-input、el-select 和 el-textarea 在禁用状态下的文字颜色不一致。通过深入研究,我们…

网络通信与协议栈 -- OSI,TCP/IP模型,协议族,UDP编程

网络通信的核心是实现不同主机上进程间的数据交换,其技术体系围绕 “协议分层模型” 展开,向下依赖硬件介质传输电 / 光信号,向上支撑各类网络应用(如网页浏览、文件传输)。本文结合 OSI 理论框架与 TCP/IP 工业标准&a…

HarmonyOS 新一代声明式 UI 弹窗机制:从 AlertDialog 到 CustomDialogController 的深度解析与实践

好的,请看这篇关于 HarmonyOS 新一代声明式 UI 弹窗机制的技术文章。 HarmonyOS 新一代声明式 UI 弹窗机制:从 AlertDialog 到 CustomDialogController 的深度解析与实践 引言 在 HarmonyOS 应用开发中,弹窗(Dialog)是…

混合推理模型(快思考、慢思考模型)

目录基础transformer架构、transformers库预训练模型的微调(Fine-tuning)预训练微调的大模型应用模式base 模型、instruct 模型区别Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安装 # 1,下载 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面机装备中的应用

随着食品加工行业向自动化、智能化转型,面机装备对控制系统的响应速度、布线灵活性及稳定性提出了更高要求。本案例以某大型食品机械制造企业的全自动面条生产线升级项目为背景,引入 MR30 分布式 IO 模块替代传统集中式 IO 方案。通过将 MR30 分布式 IO …

Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战

Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战 在科研数据处理和论文写作过程中,结构化数据的管理极为重要。Matlab的table类型为研究生和科研人员提供了灵活、高效的数据存储与处理方式,尤其适合实验结果整理、分组统计、数据预处理等场景。本文将系统介…

STM32的时钟系统与时钟树的配置

STM32的时钟系统是其微控制器(MCU)的核心组成部分,负责为CPU、外设和存储器等模块提供精确的时序信号。其设计灵活且复杂,通过多级时钟树(Clock Tree)实现时钟源的选择、分频和分配。以下是详细介绍&#x…

NV 工具metrics分析(ncu, nsys/torch profiler)

以下分析都以A100硬件架构为例; Theoretical Max Active Warps per SM: 64 Register number: 512 (规定每个thread不能超过256) Theoretical Active Warps per SM [warp]:512//registers_per_thread*4, which defines theoretical active warp occupancy Waves P…

[CISCN2019 总决赛 Day2 Web1]Easyweb

登录界面可以看到随机切换的图片。从页面源码中可以看到<div class"avtar"><img src"image.php?id3" width"200" height"200"/></div>&#xff0c;图片文件的请求地址&#xff0c;并且有传参id。web应用中像这种动…

第 3 讲:KAFKA生产者(Producer)详解

这是一篇既照顾入门也能给高级工程师提供落地经验的实战笔记。0. TL;DR&#xff08;先上结论&#xff09; 想稳&#xff1a;acksall 合理 retries&#xff1b;需要“分区内不重不丢”→ 再加 enable.idempotencetrue 且 max.in.flight<5。想快&#xff1a;适度增大 batch.s…

微信小程序截屏与录屏功能详解

微信小程序提供了丰富的API支持截屏和录屏功能&#xff0c;适用于多种场景&#xff0c;如教育类应用的课程录制、游戏类应用的精彩瞬间分享、电商类应用的商品展示等。以下将详细介绍实现方法和应用案例。 截屏功能实现 截屏功能通过调用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

写在前面 在函数式组件主导的 React 项目中&#xff0c;高阶组件&#xff08;HOC&#xff09;并非首选推荐&#xff0c;更建议优先使用 Hooks来实现复用逻辑。核心原因是 HOC 存在固有的设计缺陷&#xff0c;而 Hooks 能更优雅、简洁地解决相同问题&#xff0c;同时避免 HOC 的…

【 苍穹外卖 | Day2】

1. 相关视频 Day2的全部视频集数 2. 学习记录 2.1 对象属性拷贝 当DTO与实体类或者VO对象之间的一个装换的时候&#xff0c;如果通过new创建对象&#xff0c;然后调用set方法进行属性赋值&#xff0c;不够方便&#xff0c;代码不够简洁。当属性过多时候&#xff0c;代码就会…