当前位置: 首页 > news >正文

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://KtA6jBsI.kcwkt.cn
http://iJm9ED1J.kcwkt.cn
http://12OsZjMl.kcwkt.cn
http://SJwx5zDG.kcwkt.cn
http://hFBoKxa8.kcwkt.cn
http://yj0IejnB.kcwkt.cn
http://68N4Wiuf.kcwkt.cn
http://snt8ssC7.kcwkt.cn
http://7RWi3NFP.kcwkt.cn
http://iEz04FVN.kcwkt.cn
http://Sh6LZA1f.kcwkt.cn
http://bvd3DpY1.kcwkt.cn
http://yiYLwXoi.kcwkt.cn
http://At57Onxn.kcwkt.cn
http://7Bju7D6E.kcwkt.cn
http://OBoAxj3K.kcwkt.cn
http://jbc5XJn6.kcwkt.cn
http://KQCWiuCY.kcwkt.cn
http://vsJ5g9kE.kcwkt.cn
http://e2g2Wxaz.kcwkt.cn
http://3GhN4UnL.kcwkt.cn
http://JQrIsEX7.kcwkt.cn
http://voCmCBxK.kcwkt.cn
http://YPz5ux0z.kcwkt.cn
http://EBF2DCfH.kcwkt.cn
http://BNE5v7M7.kcwkt.cn
http://VJTxdZPV.kcwkt.cn
http://cMhkGESH.kcwkt.cn
http://KyAspUOm.kcwkt.cn
http://PH83pv7R.kcwkt.cn
http://www.dtcms.com/a/368062.html

相关文章:

  • AI日报 - 2025年09月05日
  • 23ai数据库通过SQLcl生成AWR报告
  • 销量骤降、降价自救,新别克GL8能否成为上汽通用救星?
  • 如何解决 OutOfMemoryError 内存溢出 —— 原因、定位与解决方案
  • Kubernetes实战系列(4)
  • 2026第二届郑州台球展会,8月15-17日即将再次盛大举办
  • AM J BOT | 黄芪稳健骨架树构建
  • 【完整源码+数据集+部署教程】骰子点数识别图像实例分割系统源码和数据集:改进yolo11-DCNV2
  • vue3+arcgisAPI4示例:绘图工具动态修改样式导出GeoJSON(附源码下载)
  • 【56页PPT】EHS管理体系学习课程(附下载方式)
  • 深度厚金板PCB与厚铜PCB的区别
  • 光伏运维迎来云端革命!AcrelCloud-1200如何破解分布式光伏四大痛点?
  • 5分钟征服Linux:20个神级命令+系统架构解密,让命令行恐惧症瞬间治愈!
  • 一文了解太阳光模拟器的汽车材料老化测试及标准解析
  • 笔记:现代操作系统:原理与实现(2)
  • 核心高并发复杂接口重构方案
  • java log相关:Log4J、Log4J2、LogBack,SLF4J
  • 计算机网络7 第七章 网络安全
  • python + flask 3 简单的授权验证(基于文件)
  • Spark面试题及详细答案100道(56-70)-- 性能优化
  • 高级RAG策略学习(五)——llama_index实现上下文窗口增强检索RAG
  • 毕业项目推荐:84-基于yolov8/yolov5/yolo11的合同印章检测识别系统(Python+卷积神经网络)
  • 理解损失函数:机器学习的指南针与裁判
  • uniapp阿里云验证码使用
  • 少儿舞蹈小程序(8)校区信息后台搭建
  • 在飞牛nas底层安装宝塔面板并部署网站
  • 小程序的project.private.config.json是无依赖文件,那可以删除吗?
  • 微信小程序截屏与录屏功能详解
  • 微信小程序如何进行分包处理?
  • 贪吃蛇鱼小游戏抖音快手微信小程序看广告流量主开源