java23种设计模式-桥接模式

news/2025/2/26 7:15:11

桥接模式(Bridge Pattern)学习笔记

🌟 定义

桥接模式属于结构型设计模式,将抽象部分与实现部分分离,使它们可以独立变化。通过组合代替继承的方式,解决多维度的扩展问题,防止类爆炸。


🎯 适用场景

  1. 需要避免抽象与实现之间的永久绑定
  2. 多个维度变化的系统(如形状×颜色×材质)
  3. 需要在运行时切换实现
  4. 存在多个独立扩展的维度
  5. 需要共享实现(多个对象共享相同实现)

🔧 模式结构

📐 类图

«abstract»
Abstraction
-implementor: Implementor
+operation()
RefinedAbstraction
+operation()
«interface»
Implementor
+operationImpl()
ConcreteImplementorA
+operationImpl()
ConcreteImplementorB
+operationImpl()

🛠️ 核心组成

  1. Abstraction(抽象类)

    • 定义抽象接口
    • 维护实现者对象(Implementor)的引用
  2. RefinedAbstraction(扩展抽象类)

    • 对抽象接口的扩展/细化
  3. Implementor(实现者接口)

    • 定义实现类的接口
  4. ConcreteImplementor(具体实现类)

    • 实现Implementor接口的具体类

📝 代码示例

图形渲染场景

// 实现者接口:颜色渲染
interface Color {
    String fill();
}

// 具体实现类
class Red implements Color {
    @Override
    public String fill() {
        return "红色";
    }
}

class Blue implements Color {
    @Override
    public String fill() {
        return "蓝色";
    }
}

// 抽象类:形状
abstract class Shape {
    protected Color color;
    
    public Shape(Color color) {
        this.color = color;
    }
    
    abstract String draw();
}

// 扩展抽象类
class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }
    
    @Override
    public String draw() {
        return "圆形 ➤ 填充颜色:" + color.fill();
    }
}

class Square extends Shape {
    public Square(Color color) {
        super(color);
    }
    
    @Override
    public String draw() {
        return "方形 ■ 填充颜色:" + color.fill();
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        Color red = new Red();
        Color blue = new Blue();
        
        Shape redCircle = new Circle(red);
        Shape blueSquare = new Square(blue);
        
        System.out.println(redCircle.draw());  // 圆形 ➤ 填充颜色:红色
        System.out.println(blueSquare.draw()); // 方形 ■ 填充颜色:蓝色
    }
}

✅ 优点

  1. 解耦抽象与实现,提高扩展性
  2. 避免多层继承导致的类爆炸
  3. 符合开闭原则(可独立扩展抽象层和实现层)
  4. 符合单一职责原则(抽象关注高层逻辑,实现关注底层细节)
  5. 运行时切换实现(动态绑定)

⚠️ 缺点

  1. 增加系统复杂度
  2. 需要正确识别抽象和实现两个维度
  3. 对高内聚的系统可能不适用
  4. 需要更多的设计前期分析

🔄 相关模式对比

模式区别
适配器模式事后补救 vs 事前设计
抽象工厂可与桥接模式配合创建实现对象
策略模式侧重算法替换 vs 结构分离

💡 实践建议

  1. 识别变化维度:至少有两个独立变化的维度
  2. 优先组合:使用组合代替继承
  3. 接口设计:保持Implementor接口足够精简
  4. 桥接管理:可使用工厂模式创建桥接对象
  5. 多层桥接:支持多级桥接(如抽象→中间层→实现)

🚀 典型应用

  1. GUI开发

    • 窗口系统(不同OS的窗口实现)
    • 控件渲染(按钮×主题)
  2. 驱动程序

    • JDBC驱动程序
    • 打印机驱动程序
  3. 跨平台应用

    • 不同数据库的SQL生成器
    • 不同支付渠道的支付接口

📌 实现要点

  1. 委托代替继承

    // 传统继承方式(类爆炸)
    class RedCircle extends Circle {}
    class BlueCircle extends Circle {}
    class RedSquare extends Square {}
    // ...其他组合
    
    // 桥接模式方式
    new Circle(new Red())
    
  2. 动态切换实现

    Shape shape = new Circle(new Red());
    shape.draw(); // 红色圆形
    
    shape.color = new Blue(); // 切换颜色实现
    shape.draw(); // 蓝色圆形
    
  3. JDBC中的桥接模式

    // 抽象:Connection接口
    // 实现:Driver实现类
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(url);
    

🌈 扩展应用

  • 多格式日志系统

    • 日志级别(DEBUG/INFO/ERROR)× 输出格式(文本/JSON/XML)
  • 跨平台文件操作

    • 文件类型(普通/加密)× 存储系统(本地/FTP/云存储)
  • 游戏角色系统

    • 角色职业(战士/法师)× 装备套装(轻甲/重甲)

掌握桥接模式的关键在于理解多维变化的分离思想,通过将抽象与实现解耦,可以实现更灵活的系统架构,特别适合需要应对多维度扩展的复杂系统设计。


http://www.niftyadmin.cn/n/5868285.html

相关文章

前端如何解决跨域

解决前端跨域问题有多种方法 JSONP&#xff1a;利用 <script> 标签的跨域能力&#xff0c;通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求&#xff0c;安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…

分治算法、动态规划、贪心算法、分支限界法和回溯算法的深度对比

1. 分治算法 (Divide and Conquer) 核心思想 分治法三步曲&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将原问题拆分为多个子问题解决&#xff08;Conquer&#xff09;&#xff1a;递归解决子问题合并&#xff08;Combine&#xff09;&#xff1a;合并子问题…

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用&#xff0c;涵盖 1&…

【Linux Oracle】time命令+oracle exp压缩

Linux && Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.说明 Linux中的time命令&#xff1a;主要用于测量命令的执行时间&#xff0c;并显示该命令在执行过程中所使用的系统资源情况&#xff0c;如CPU时间、内存和…

nss刷题4

[SWPUCTF 2023 秋季新生赛]Pingpingping 看看源码&#xff0c;首先是get传参Ping_ip.exe,然后如果请求了_ping参数&#xff0c;就会执行ping命令&#xff0c;执行三次 <?php highlight_file(__FILE__); error_reporting(0); $_ping $_GET[Ping_ip.exe]; if(isset($_ping…

深度学习奠基作 AlexNet 论文阅读笔记(2025.2.25)

文章目录 训练数据集数据预处理神经网络模型模型训练正则化技术模型性能其他补充 训练数据集 模型主要使用2010年和2012年的 ImageNet 大规模视觉识别挑战赛&#xff08;ILSVRC&#xff09;提供的 ImageNet 的子集进行训练&#xff0c;这些子集包含120万张图像。最终&#xff…

Python游戏编程之赛车游戏6-3

1 “敌人”汽车类的创建 在创建玩家汽车类之后&#xff0c;接下来创建“敌人”汽车类。“敌人”汽车类与玩家类一样&#xff0c;也是包含两个方法&#xff0c;一个是__init__()&#xff0c;另一个是move()。 1.1 __init__()方法 “敌人”汽车类的__init__()方法代码如图1所示…

蓝桥杯好题推荐------蛇形方阵

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 题目链接 P5731 【深基5.习6】蛇形方阵 - 洛谷 解题思路 对于这道题目来说&#xff0c;这道题题目中很重要的就是模拟实现顺时针填入数字的过程&#xff0c;而一个很好的&…