8.设计模式-BRIDGE(桥接)
一、模式定义与核心价值
桥接模式是一种结构型设计模式,其核心目标是分离抽象与实现,使二者能够独立变化,从而避免因多维扩展导致的类爆炸问题。通过组合代替继承,桥接模式实现了以下核心价值:
- 维度解耦:将不同维度的变化(如形状与颜色、设备与驱动)解绑,消除类层次间的强耦合
- 灵活扩展:新增维度只需扩展对应类,无需修改现有代码(遵循开闭原则)
- 动态切换:运行时可通过组合不同维度的实现对象,动态构建功能组合
- 代码复用:相同实现可被多个抽象类复用,减少重复代码
工业级场景:
- 跨平台应用开发(同一功能在不同操作系统的实现)
- 图形渲染系统(几何形状与渲染引擎的解耦)
- 设备驱动管理(硬件设备与通信协议的独立扩展)
二、模式组成与UML类图
核心角色:
- Abstraction(抽象化):定义高层接口,维护对实现化对象的引用(如
Shape类) - RefinedAbstraction(扩展抽象化):继承抽象化接口,扩展业务逻辑(如
Circle类) - Implementor(实现化接口):定义底层实现接口(如
Color接口) - ConcreteImplementor(具体实现化):实现接口的具体类(如
Red类)
UML类图:
classDiagram
class Abstraction {
<<abstract>>
-implementor: Implementor
+operation()
}
class RefinedAbstraction {
+operation()
}
class Implementor {
<<interface>>
+operationImpl()
}
class ConcreteImplementorA {
+operationImpl()
}
class ConcreteImplementorB {
+operationImpl()
}
Abstraction <|-- RefinedAbstraction
Abstraction --> Implementor
Implementor <|.. ConcreteImplementorA
Implementor <|.. ConcreteImplementorB

协作流程:
- 客户端创建具体实现化对象(如
new Red()) - 将实现化对象注入扩展抽象化类(如
new Circle(red)) - 调用抽象化接口方法,委托给实现化对象执行具体逻辑
三、代码实现示例
场景:实现图形绘制系统,支持不同形状(圆形、矩形)与颜色(红、蓝)的自由组合
1. 实现化接口(颜色维度)
// 颜色接口(Implementor)
interface Color {
void applyColor();
}
// 具体实现:红色
class Red implements Color {
@Override
public void applyColor() {
System.out.print("红色");
}
}
// 具体实现:蓝色
class Blue implements Color {
@Override
public void applyColor() {
System.out.print("蓝色");
}
}
2. 抽象化类(形状维度)
// 形状抽象类(Abstraction)
abstract class Shape {
protected Color color;
public Shape(Color color) {
this.color = color; // 桥接关键点
}
abstract void draw();
}
// 扩展抽象化:圆形
class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
void draw() {
color.applyColor();
System.out.println("圆形");
}
}
// 扩展抽象化:矩形
class Rectangle extends Shape {
public Rectangle(Color color) {
super(color);
}
@Override
void draw() {
color.applyColor();
System.out.println("矩形");
}
}
3. 客户端调用
public class Client {
public static void main(String[] args) {
// 红色圆形组合
Shape redCircle = new Circle(new Red());
redCircle.draw(); // 输出:红色圆形
// 蓝色矩形组合
Shape blueRect = new Rectangle(new Blue());
blueRect.draw(); // 输出:蓝色矩形
}
}
四、工业级源码应用
- JDBC驱动体系
-
**DriverManager**:通过Connection接口桥接不同数据库实现(如MySQL、Oracle)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
- Android图形库
**View**与**Canvas**:View抽象视图绘制逻辑,Canvas提供底层图形API实现(OpenGL/Skia)
public class CustomView extends View {
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.RED); // 桥接具体绘制实现
}
}
- 日志框架扩展
- SLF4J:作为抽象层桥接Log4j、Logback等不同日志实现
Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.info("Message"); // 实际调用Logback/Log4j实现
- 游戏引擎渲染
-
- Unity的Shader系统:抽象渲染算法,桥接不同GPU的底层图形API(DX/OpenGL/Metal)
surfaceShader.Albedo = _Color.rgb; // 桥接到具体图形API指令
- 跨平台开发框架
-
- Flutter的Platform Channel:Dart抽象业务逻辑,通过桥接调用Android/iOS原生API
MethodChannel('battery').invokeMethod('getLevel'); // 桥接平台实现
五、模式对比与选型建议
| 维度 | 传统继承方案 | 桥接模式方案 |
|---|---|---|
| 类数量 | N×M(形状×颜色导致类爆炸) | N+M(线性扩展) |
| 扩展性 | 新增维度需修改所有相关类 | 新增维度只需扩展对应层次 |
| 运行时灵活性 | 编译时绑定,无法动态切换 | 运行时通过组合动态调整 |
| 维护成本 | 修改牵一发而动全身 | 局部修改不影响其他模块 |
最佳实践建议:
- 识别变化维度:当系统存在两个及以上独立变化的维度时优先考虑桥接模式
- 避免过度设计:简单场景(单维度变化)可直接使用继承
- 结合工厂模式:通过工厂类管理具体实现化的创建过程
总结
桥接模式通过组合维度的设计哲学,为多维扩展场景提供了优雅的解决方案。在Java生态中,该模式已深度融入JDBC、日志框架等核心组件,并在游戏引擎、跨平台开发等领域展现强大生命力。掌握桥接模式的关键在于准确识别变化维度,并建立清晰的抽象-实现边界,从而构建出灵活可扩展的系统架构。

浙公网安备 33010602011771号