Skip to content

桥接模式 低频

桥接模式(Bridge Pattern)将抽象部分与它的实现部分分离,使两者都可以独立地变化。它通过组合代替继承,解决因多维度变化导致的类爆炸问题。

优缺点

优点缺点
抽象与实现分离,各自独立扩展增加系统复杂度,需额外设计和引入抽象层
符合开闭原则,新增维度无需修改现有代码需正确识别出变化的维度,抽象设计较难把握
实现细节对客户端透明多层抽象组合可能导致理解成本增加
组合优于继承,减少子类数量

适用场景

  • 一个类存在两个或多个独立变化的维度,且都需要扩展
  • 不希望使用继承导致子类爆炸时
  • 需要运行时动态切换实现
  • 多个类共享同一套实现,但抽象接口不同

桥接模式 vs 继承

假设有 形状颜色 两个维度,每种形状都有多种颜色:

继承方案:RedCircle、BlueCircle、RedSquare、BlueSquare……
          形状 × 颜色 = 爆炸

桥接方案:Shape → 持有 Color,各自独立派生
          形状 N + 颜色 M = N + M 个类

桥接模式

java
// 实现层接口:颜色
interface Color {
    void applyColor();
}

// 具体实现:红色
class Red implements Color {
    @Override
    public void applyColor() {
        System.out.println("红色");
    }
}

// 具体实现:蓝色
class Blue implements Color {
    @Override
    public void applyColor() {
        System.out.println("蓝色");
    }
}

// 抽象层:形状(持有 Color 引用)
abstract class Shape {
    protected Color color;  // 桥接 —— 组合而非继承

    protected Shape(Color color) {
        this.color = color;
    }

    abstract void draw();
}

// 扩展抽象:圆形
class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }

    @Override
    void draw() {
        System.out.print("画圆形,颜色:");
        color.applyColor();
    }
}

// 扩展抽象:正方形
class Square extends Shape {
    public Square(Color color) {
        super(color);
    }

    @Override
    void draw() {
        System.out.print("画正方形,颜色:");
        color.applyColor();
    }
}

// 使用
public class Client {
    public static void main(String[] args) {
        Shape redCircle = new Circle(new Red());
        Shape blueSquare = new Square(new Blue());

        redCircle.draw();   // 画圆形,颜色:红色
        blueSquare.draw();  // 画正方形,颜色:蓝色

        // 运行时切换实现
        redCircle.color = new Blue();
        redCircle.draw();   // 画圆形,颜色:蓝色
    }
}

经典应用

  • JDBC 驱动DriverManager(抽象)与各数据库驱动(实现)通过桥接模式协作
  • Java AWTPeer 架构将 UI 组件与具体平台(Windows/Mac/Linux)分离
  • Logger 框架:日志门面 + 不同实现(Logback、Log4j2)

与适配器模式的区别

模式目的时机
桥接模式分离抽象与实现,使两者独立变化设计阶段,预先规划
适配器模式让不兼容的接口协同工作事后补救,已有代码不适配

如有转载或 CV 请标注本站原文地址