《桥接模式》|设计模式系列第08篇
系列:结构型模式 · 桥接模式(Bridge Pattern)
关键词:维度分离、抽象与实现解耦、组合代替继承、多维度扩展
一、什么是桥接模式
桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立地变化。

属于结构型设计模式。
简单理解:
当一个类存在两个或多个独立变化的维度时,不要使用继承来扩展,改用组合搭建一座“桥”,把抽象层和实现层连接起来。继承是静态绑定,桥接是动态组合,两个维度可以各自独立扩展,互不影响。
核心意图
避免多层继承带来的类爆炸;把多维度变化拆分成两套独立体系,通过组合关联。
适用场景
- 类有多个变化维度,维度都需要扩展
- 不想使用继承,或者继承会导致类数量急剧膨胀
- 需要在运行时动态切换实现层
- 抽象和实现需要独立扩展迭代
⚠️ 缺点预警:增加系统抽象层次,提高理解难度;需要识别出系统中独立变化的维度,识别难度较高。
二、UML结构图
角色划分:
- Abstraction(抽象类):定义抽象接口,持有实现层对象引用(桥)
- RefinedAbstraction(扩充抽象类):扩展抽象类,新增抽象层能力
- Implementor(实现接口):定义实现层基础接口,不需要完整实现
- ConcreteImplementor(具体实现类):实现Implementor接口,提供具体逻辑

三、Java 完整示例
场景:消息推送系统。
变化维度1:消息类型(普通消息、紧急消息)【抽象层】
变化维度2:发送渠道(短信、邮件)【实现层】
如果用继承:普通短信、普通邮件、紧急短信、紧急邮件,类数量随维度乘积增长。
桥接模式拆分两个维度,使用组合关联。
1. 实现层接口 Implementor
// 发送渠道接口(实现层)
public interface MessageSender {
void send(String content);
}
2. 具体实现类 ConcreteImplementor
// 短信发送
public class SmsSender implements MessageSender {
@Override
public void send(String content) {
System.out.println("【短信】发送消息:" + content);
}
}
// 邮件发送
public class EmailSender implements MessageSender {
@Override
public void send(String content) {
System.out.println("【邮件】发送消息:" + content);
}
}
3. 抽象类 Abstraction
// 消息抽象类(抽象层),持有发送渠道引用,作为桥
public abstract class Message {
protected MessageSender sender;
public Message(MessageSender sender) {
this.sender = sender;
}
public abstract void sendMessage(String content);
}
4. 扩充抽象类 RefinedAbstraction
// 普通消息
public class NormalMessage extends Message {
public NormalMessage(MessageSender sender) {
super(sender);
}
@Override
public void sendMessage(String content) {
sender.send("普通消息:" + content);
}
}
// 紧急消息
public class UrgentMessage extends Message {
public UrgentMessage(MessageSender sender) {
super(sender);
}
@Override
public void sendMessage(String content) {
sender.send("【紧急】" + content);
}
}
5. 客户端调用
public class Client {
public static void main(String[] args) {
// 普通消息,短信渠道
Message normalSms = new NormalMessage(new SmsSender());
normalSms.sendMessage("订单已发货");
// 紧急消息,邮件渠道
Message urgentEmail = new UrgentMessage(new EmailSender());
urgentEmail.sendMessage("账户异常,请尽快处理");
}
}
新增渠道:只新增 MessageSender;新增消息类型:只新增 Message 子类,两个维度独立扩展。
四、优缺点总结
✅ 优点
- 分离抽象与实现,二者独立扩展,互不干扰
- 解决多维度继承导致的类爆炸,遵循合成复用原则
- 运行时动态切换实现对象,灵活性高
- 抽象层和实现层解耦
❌ 缺点
- 需要识别独立变化维度,设计门槛高
- 增加抽象层次,提升代码理解成本
五、桥接模式 vs 适配器模式
| 模式 | 目的 | 核心 |
|---|---|---|
| 桥接模式 | 事前设计,分离两个变化维度 | 搭建桥梁,两个体系独立扩展 |
| 适配器模式 | 事后兼容,转换已有不兼容接口 | 包装适配,解决接口不匹配 |
六、框架源码应用
- JDBC Driver:Driver 作为实现层,Connection 抽象层,桥接不同数据库驱动
- Spring
MessageSource - AWT 中绘制组件(Component + Graphics)经典桥接案例
七、小结
桥接模式核心:识别两个独立变化维度,用组合代替继承,抽象和实现分离。
判断是否适合桥接:当发现类沿着多个维度变化,并且维度未来都需要扩展,优先考虑桥接。
0 条笔记