网站首页 > 技术文章 正文
一句话定义:
桥接模式(Bridge Pattern)将抽象与实现解耦,使两者可独立变化。它通过组合代替继承,避免类爆炸问题。
一、适用场景(何时用?)
- 多维变化:
当类存在多个独立变化的维度(如形状×颜色×材质),且维度可能扩展时。
反例:用继承实现 圆形+红色、方形+蓝色 会导致 CircleRed、SquareBlue 等类爆炸。 - 运行时切换实现:
需要在运行时动态切换抽象类的实现(如切换数据库驱动、渲染引擎)。 - 避免紧耦合:
当抽象和实现都应通过子类化扩展,但直接继承导致两者紧密绑定。
二、代码案例:图形渲染引擎
需求:
- 支持不同形状(圆形、方形)
- 支持不同渲染API(OpenGL、Vulkan)
- 可灵活扩展新形状或渲染引擎
1. 传统继承 VS 桥接模式
https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1a2b3d4d3f7d4f1a8b0d4e4a4a4b4b4d~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=600&h=300&s=123456&e=png&b=f0f0f0
继承方案:每新增一个形状×引擎组合,需一个新子类(如 OpenGLCircle)。
桥接方案:拆分为“形状抽象” + “渲染实现”,用组合连接。
2. 桥接模式实现
// 1. 实现接口:渲染引擎(独立变化维度)
interface RenderEngine {
void renderCircle(float radius);
void renderSquare(float side);
}
// 具体实现:OpenGL
class OpenGL implements RenderEngine {
@Override
public void renderCircle(float radius) {
System.out.println("OpenGL渲染圆形,半径:" + radius);
}
@Override
public void renderSquare(float side) {
System.out.println("OpenGL渲染方形,边长:" + side);
}
}
// 具体实现:Vulkan
class Vulkan implements RenderEngine {
@Override
public void renderCircle(float radius) {
System.out.println("Vulkan渲染圆形,半径:" + radius);
}
@Override
public void renderSquare(float side) {
System.out.println("Vulkan渲染方形,边长:" + side);
}
}
// 2. 抽象类:形状(另一个独立变化维度)
abstract class Shape {
protected RenderEngine engine; // 组合渲染引擎
public Shape(RenderEngine engine) {
this.engine = engine;
}
public abstract void draw();
}
// 具体抽象:圆形
class Circle extends Shape {
private float radius;
public Circle(float radius, RenderEngine engine) {
super(engine);
this.radius = radius;
}
@Override
public void draw() {
engine.renderCircle(radius); // 委托给实现
}
}
// 具体抽象:方形
class Square extends Shape {
private float side;
public Square(float side, RenderEngine engine) {
super(engine);
this.side = side;
}
@Override
public void draw() {
engine.renderSquare(side); // 委托给实现
}
}
// 3. 客户端调用
public class Client {
public static void main(String[] args) {
// 动态组合:圆形 + OpenGL
Shape circle = new Circle(5.0f, new OpenGL());
circle.draw(); // 输出:OpenGL渲染圆形,半径:5.0
// 动态切换:方形 + Vulkan
Shape square = new Square(10.0f, new Vulkan());
square.draw(); // 输出:Vulkan渲染方形,边长:10.0
}
}
三、优缺点分析
优点 | 缺点 |
解耦抽象与实现,独立扩展维度 | 增加系统复杂度 |
避免继承导致的类爆炸 | 需正确识别变化维度 |
运行时动态切换实现(如更换数据库) | |
符合开闭原则(扩展无需修改旧代码) |
四、典型应用场景
- 跨平台UI开发
- 抽象:窗口、按钮
- 实现:Windows/macOS 渲染引擎
- 数据库驱动
- 抽象:SQL接口
- 实现:MySQL/Oracle 驱动
- 支付网关
- 抽象:支付接口
- 实现:微信/支付宝/银联 SDK
五、关键总结
- 核心思想:
组合 > 继承,用“桥梁”(组合对象)连接抽象与实现。 - 使用时机:
代码中出现多个正交变化维度时,果断用桥接! - 避坑指南:
- 不要滥用!只有真正存在多维度变化时才用。
- 分清“抽象”和“实现”:抽象是高层控制逻辑,实现是底层细节。
最后一句:
桥接模式是设计模式中的“分而治之”大师,拆得开,控得住,变得动。
猜你喜欢
- 2025-07-23 国产化红利到底在哪?好多人都在瞎折腾
- 2025-07-23 Oracle 推出 Java 24,增强 AI 支持和后量子加密
- 2025-07-23 SpringBoot条件化配置(@Conditional)全面解析与实战指南
- 2024-10-26 一个前后端分离的Java快速开发平台platform-plus
- 2024-10-26 Oracle-MySQL透明网关配置中关于Driver的坑
- 2024-10-26 pycharm连接数据库失败的解决方法!pycharm连接数据库报错原因!
- 2024-10-26 埃里森炮轰亚马逊AWS不安全,发布Oracle云2.0
- 2024-10-26 JDBC常用的几款数据库驱动程序名及URL
- 2024-10-26 重磅!Spring Boot 2.6 正式发布,一大波新特性,看完我彻底躺平了
- 2024-10-26 LR使用odbc连接oracle数据库,查询数据用于参数化
你 发表评论:
欢迎- 624℃几个Oracle空值处理函数 oracle处理null值的函数
- 616℃Oracle分析函数之Lag和Lead()使用
- 605℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 601℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 596℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 589℃【数据统计分析】详解Oracle分组函数之CUBE
- 577℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 565℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- 国产化红利到底在哪?好多人都在瞎折腾
- Oracle 推出 Java 24,增强 AI 支持和后量子加密
- JAVA桥接模式适用场景,优缺点是什么你知道吗,这篇文章彻底讲透
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
- Navicat Data Modeler使用教程十二:配置
- 软件测试|数据库的内连接,左连接,右链接分别是什么
- 每日学习“IT”是什么呢?(每日学习每日一词)
- SQLite:小众?其实它比你想象的更普及,连这个领域都有人用!
- 【推荐】一款实用且跨平台的数据库管理神器,支持Web浏览器
- Spring Batch中的JobRepository:批处理的“记忆大师”是如何工作
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)