1. 概述
桥接模式(Bridge Pattern)是四人组(Gang of Four, GoF)提出的一种结构型设计模式。它的核心思想是:将抽象与实现解耦,使两者可以独立变化。
✅ 简单粗暴地说,就是不让继承关系变得爆炸。比如你有多个图形和多种颜色,如果不使用桥接,每种组合都得写一个类(红圆、蓝圆、红方、蓝方……),类爆炸就来了。
桥接模式通过“组合”代替“继承”,把可变的部分(比如颜色)抽出来,通过一个“桥”连接到主结构上。这样,新增形状或颜色都不需要改对方的代码,符合开闭原则。
2. 桥接模式示例
我们以图形绘制为例:有两个维度的变化——图形类型(如三角形、正方形)和 填充颜色(如红色、蓝色)。这两个维度都应该能独立扩展。
下面是类结构图:
2.1 定义颜色接口
首先定义一个颜色行为的接口:
public interface Color {
String fill();
}
2.2 实现具体颜色
实现一个蓝色的具体颜色类:
public class Blue implements Color {
@Override
public String fill() {
return "Color is Blue";
}
}
你可以轻松添加 Red
、Green
等其他颜色实现,无需修改已有代码。
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();
}
}
同理,可以创建 Triangle
、Circle
等类,它们都能复用所有颜色实现。
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