1. 概述

桥接模式(Bridge Pattern)是四人组(Gang of Four, GoF)提出的一种结构型设计模式。它的核心思想是:将抽象与实现解耦,使两者可以独立变化

✅ 简单粗暴地说,就是不让继承关系变得爆炸。比如你有多个图形和多种颜色,如果不使用桥接,每种组合都得写一个类(红圆、蓝圆、红方、蓝方……),类爆炸就来了。

桥接模式通过“组合”代替“继承”,把可变的部分(比如颜色)抽出来,通过一个“桥”连接到主结构上。这样,新增形状或颜色都不需要改对方的代码,符合开闭原则。

2. 桥接模式示例

我们以图形绘制为例:有两个维度的变化——图形类型(如三角形、正方形)和 填充颜色(如红色、蓝色)。这两个维度都应该能独立扩展。

下面是类结构图:

bridge diagram

2.1 定义颜色接口

首先定义一个颜色行为的接口:

public interface Color {
    String fill();
}

2.2 实现具体颜色

实现一个蓝色的具体颜色类:

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

你可以轻松添加 RedGreen 等其他颜色实现,无需修改已有代码。

2.3 抽象图形类(桥接的“抽象”端)

接下来定义一个抽象的 Shape 类,它持有一个 Color 类型的引用——这就是“桥”:

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

    abstract public String draw();
}

⚠️ 注意:这里不是用继承来决定颜色,而是通过构造器注入 Color 实例,实现运行时绑定。

2.4 具体图形实现

创建一个正方形类,使用桥接的颜色:

public class Square extends Shape {

    public Square(Color color) {
        super(color);
    }

    @Override
    public String draw() {
        return "Square drawn. " + color.fill();
    }
}

同理,可以创建 TriangleCircle 等类,它们都能复用所有颜色实现。

2.5 验证桥接效果

测试代码如下:

@Test
public void whenBridgePatternInvoked_thenConfigSuccess() {
    // 画一个红色的正方形
    Shape square = new Square(new Red());
 
    assertEquals(square.draw(), "Square drawn. Color is Red");
}

输出结果为:

Square drawn. Color is Red
Triangle drawn. Color is Blue

✅ 这说明:

  • 图形和颜色完全解耦
  • 新增图形或颜色都不需要修改原有类
  • 组合方式灵活,避免了类爆炸

3. 总结

桥接模式适用于以下场景:

  • ✅ 当你需要在多个维度上扩展类,且不想通过继承导致类数量急剧增加时
  • ✅ 抽象部分依赖某个接口行为(如本例中的 Color),而具体实现可在运行时切换
  • ✅ 希望对客户端隐藏实现细节,只暴露高层抽象

❌ 不要滥用:如果变化维度很少,或者未来几乎不会扩展,直接继承更简单。

该模式的核心价值在于 用组合替代继承,提升系统的可维护性和扩展性。

完整源码可在 GitHub 获取:https://github.com/eugenp/tutorials/tree/master/patterns-modules/design-patterns-structural


原始标题:The Bridge Pattern in Java | Baeldung