Skip to content

桥接模式解决的是"两个维度独立变化导致的类爆炸"——把"抽象"和"实现"拆开,各自独立扩展。JDBC 就是它的经典落地。这篇讲清它怎么拆、以及什么时候用。

一、解决什么问题:类爆炸

想象"形状 × 颜色"两个维度:形状有圆形/方形,颜色有红/蓝。不用桥接,就要为每种组合写一个类:

红圆、蓝圆、红方、蓝方 → 4 个类(形状 × 颜色 = 类爆炸)

形状再加一个"三角形"、颜色再加"绿",类数量就是 3×3=9 个,指数爆炸。

桥接的思路:形状持有"颜色"的引用,形状和颜色各自独立扩展,类数量从"相乘"变成"相加"。

二、核心结构

java
// 实现维度:颜色
interface Color { String fill(); }
class Red implements Color { public String fill() { return "红"; } }
class Blue implements Color { public String fill() { return "蓝"; } }

// 抽象维度:形状,持有颜色(这就是"桥")
abstract class Shape {
    protected Color color;          // 桥:形状组合颜色
    Shape(Color c) { this.color = c; }
    abstract void draw();
}
class Circle extends Shape {
    Circle(Color c) { super(c); }
    void draw() { System.out.println(color.fill() + "圆形"); }
}
class Square extends Shape {
    Square(Color c) { super(c); }
    void draw() { System.out.println(color.fill() + "方形"); }
}

// 使用:形状 × 颜色 自由组合,类数量是"相加"不是"相乘"
new Circle(new Red()).draw();    // 红圆
new Circle(new Blue()).draw();   // 蓝圆
new Square(new Red()).draw();    // 红方

关键:形状(抽象)和颜色(实现)通过组合连接,而不是继承。加新形状 = 加一个 Shape 子类(颜色不动),加新颜色 = 加一个 Color 实现(形状不动)。

三、核心思想:组合优于继承

桥接的本质是把"继承关系"改成"组合关系"

  • 不用桥接:红圆 extends 圆(继承,类爆炸)
  • 用桥接:圆 持有 颜色(组合,各自扩展)

这和《装饰器模式》的"组合优于继承"是同一个思想。

四、实际应用:JDBC

JDBC 是桥接的教科书级例子:

java
// DriverManager(抽象)持有 Connection(实现)
Connection conn = DriverManager.getConnection("jdbc:mysql://...");
// 换数据库 = 换驱动(实现),DriverManager 和 API 代码不变
  • 抽象DriverManagerConnectionStatement 这些 API
  • 实现:MySQL 驱动、Oracle 驱动(各自实现 Connection
  • 换数据库 = 换驱动,你的业务代码(用 Connection API)一行不动

小结

  • 桥接把"抽象"和"实现"拆开,各自独立扩展,解决类爆炸
  • 核心是"组合优于继承":形状持有颜色,而不是红圆继承圆
  • JDBC 是经典落地:DriverManager(抽象)+ 数据库驱动(实现)

相关:《装饰器模式》(同为"组合优于继承")、《适配器模式》(接口转换)。