桥接模式解决的是"两个维度独立变化导致的类爆炸"——把"抽象"和"实现"拆开,各自独立扩展。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 代码不变- 抽象:
DriverManager、Connection、Statement这些 API - 实现:MySQL 驱动、Oracle 驱动(各自实现
Connection) - 换数据库 = 换驱动,你的业务代码(用
ConnectionAPI)一行不动
小结
- 桥接把"抽象"和"实现"拆开,各自独立扩展,解决类爆炸
- 核心是"组合优于继承":形状持有颜色,而不是红圆继承圆
- JDBC 是经典落地:DriverManager(抽象)+ 数据库驱动(实现)
