My App

桥接模式

Bridge — 把抽象和实现分离,让它们可以独立变化

一句话理解

当一个事物有两个独立变化的维度时,用组合代替继承,让两个维度各自扩展,互不影响。

解决什么问题

假设要画不同颜色的不同形状:红色圆形、蓝色圆形、红色方形、蓝色方形……如果用继承,类的数量 = 颜色数 × 形状数,组合爆炸

桥接模式把"形状"和"颜色"拆成两个独立的维度,通过组合连接。

怎么写

// 维度 1:颜色(实现方)
public interface Color {
    String fill();
}

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

// 维度 2:形状(抽象方)—— 持有颜色的引用
public abstract class Shape {
    protected Color color;  // 桥接到颜色

    public Shape(Color color) { this.color = color; }
    public abstract void draw();
}

public class Circle extends Shape {
    public Circle(Color color) { super(color); }
    public void draw() {
        System.out.println("画一个" + color.fill() + "的圆形");
    }
}

public class Square extends Shape {
    public Square(Color color) { super(color); }
    public void draw() {
        System.out.println("画一个" + color.fill() + "的方形");
    }
}
// 使用:两个维度自由组合
new Circle(new Red()).draw();   // 画一个红色的圆形
new Square(new Blue()).draw();  // 画一个蓝色的方形

新增颜色或新增形状,都只需要加一个类,不会影响另一个维度。

使用场景

  • JDBC —— DriverManager(抽象)和具体数据库驱动(实现)分离
  • 跨平台消息推送 —— 消息类型(普通/紧急)× 推送渠道(短信/邮件/App)
  • 日志系统 —— 日志级别 × 输出目标(控制台/文件/远程)

On this page