Java桥接模式
桥接模式将抽象部分与实现部分分离,使它们都可独立变化。
模式定义
意图:将抽象与实现解耦,两者可独立变化。
适用场景
- 多维度变化的系统
- 需要在运行时切换实现
- 避免继承导致的类爆炸
模式结构
实现接口
Java
// 实现层接口
public interface DrawAPI {
void drawCircle(int radius, int x, int y);
}
// 具体实现
public class RedDraw implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("绘制红色圆: r=" + radius + " x=" + x + " y=" + y);
}
}
public class GreenDraw implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("绘制绿色圆: r=" + radius + " x=" + x + " y=" + y);
}
}
抽象层
Java
// 抽象层
public abstract class Shape {
protected DrawAPI drawAPI; // 桥接点
protected Shape(DrawAPI drawAPI) {
this.drawAPI = drawAPI;
}
public abstract void draw();
}
// 扩展抽象
public class Circle extends Shape {
private int radius;
private int x;
private int y;
public Circle(int radius, int x, int y, DrawAPI drawAPI) {
super(drawAPI);
this.radius = radius;
this.x = x;
this.y = y;
}
@Override
public void draw() {
drawAPI.drawCircle(radius, x, y);
}
}
使用示例
Java
// 红色圆
Shape redCircle = new Circle(10, 0, 0, new RedDraw());
redCircle.draw(); // 绘制红色圆
// 绿色圆
Shape greenCircle = new Circle(20, 5, 5, new GreenDraw());
greenCircle.draw(); // 绘制绿色圆
解决类爆炸问题
假设有2种形状(圆、矩形)和3种颜色(红、绿、蓝):
| 方式 | 类数量 |
|---|---|
| 继承 | 6个类(RedCircle, GreenCircle, BlueCircle...) |
| 桥接 | 5个类(2形状 + 3颜色 + 1抽象) |
新增1种形状或1种颜色,继承需新增3个类,桥接只需新增1个类。
JDBC桥接模式
JDBC是桥接模式的经典应用:
Java
// 抽象:Java应用
// 实现:各种数据库驱动
// 抽象层不依赖具体数据库
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
// 切换数据库只需更换驱动
// MySQL → Oracle → PostgreSQL
实际应用示例
消息发送
Java
// 实现层:发送方式
public interface MessageSender {
void send(String message);
}
public class EmailSender implements MessageSender {
@Override
public void send(String message) {
System.out.println("邮件发送: " + message);
}
}
public class SmsSender implements MessageSender {
@Override
public void send(String message) {
System.out.println("短信发送: " + message);
}
}
// 抽象层:消息类型
public abstract class Message {
protected MessageSender sender;
protected Message(MessageSender sender) {
this.sender = sender;
}
public abstract void send();
}
public class NormalMessage extends Message {
private String content;
public NormalMessage(String content, MessageSender sender) {
super(sender);
this.content = content;
}
@Override
public void send() {
sender.send("普通消息: " + content);
}
}
public class UrgentMessage extends Message {
private String content;
public UrgentMessage(String content, MessageSender sender) {
super(sender);
this.content = content;
}
@Override
public void send() {
sender.send("紧急消息: " + content);
}
}
// 使用
Message msg1 = new NormalMessage("Hello", new EmailSender());
Message msg2 = new UrgentMessage("紧急", new SmsSender());
msg1.send();
msg2.send();
桥接 vs 适配器
| 模式 | 目的 | 关系 |
|---|---|---|
| 桥接 | 分离变化维度 | 设计阶段使用 |
| 适配器 | 接口转换 | 事后补救使用 |
适用场景
- 多维度变化的系统
- 需要在运行时切换实现
- 继承导致类数量爆炸
- 跨平台实现
注意事项
确认系统有多个独立变化维度
抽象层持有实现层引用(桥接点)
两个维度可独立扩展
桥接模式增加理解难度,应识别真正需要
要点总结
- 桥接模式分离抽象与实现,独立变化
- 抽象类持有实现接口引用
- 解决多维度变化导致的类爆炸
- JDBC是桥接模式的经典应用
- 设计阶段识别变化维度,提前使用
📝 发现内容有误?点击此处直接编辑