桥接
更新: 6/28/2025 字数: 0 字 时长: 0 分钟
定义
桥接模式 (Bridge Pattern) 将抽象部分与实现部分分离,使它们可以独立变化。该模式通过组合代替继承,解决多层继承带来的类爆炸问题,提高系统可扩展性。
角色
- 抽象化 (Abstraction):定义高层控制逻辑,维护实现部分的引用
- 扩展抽象化 (Refined Abstraction):扩展抽象化接口,提供更精细控制
- 实现者接口 (Implementor):定义实现类的接口
- 具体实现者 (Concrete Implementor):实现 Implementor 接口的具体类
实现
基础桥接结构
java
// 实现者接口
public interface Device {
void enable();
void disable();
void setVolume(int percent);
}
// 具体实现者
public class Radio implements Device {
private boolean on = false;
private int volume = 30;
@Override
public void enable() { on = true; }
@Override
public void disable() { on = false; }
@Override
public void setVolume(int percent) {
volume = Math.min(100, Math.max(0, percent));
}
}
// 抽象化
public abstract class RemoteControl {
protected Device device;
public RemoteControl(Device device) {
this.device = device;
}
public abstract void togglePower();
}
// 扩展抽象化
public class AdvancedRemote extends RemoteControl {
public AdvancedRemote(Device device) {
super(device);
}
@Override
public void togglePower() {
if (device.isEnabled()) {
device.disable();
} else {
device.enable();
}
}
public void mute() {
device.setVolume(0);
}
}
JDBC 桥接示例
java
// 实现者接口 (类似 JDBC Driver)
public interface DatabaseDriver {
Connection connect(String url);
void execute(Connection conn, String query);
}
// 具体实现者 (MySQL 实现)
public class MySqlDriver implements DatabaseDriver {
@Override
public Connection connect(String url) {
// MySQL 连接实现
return new MySqlConnection(url);
}
@Override
public void execute(Connection conn, String query) {
// MySQL 执行查询
}
}
// 抽象化 (类似 JDBC API)
public abstract class JdbcTemplate {
protected DatabaseDriver driver;
public JdbcTemplate(DatabaseDriver driver) {
this.driver = driver;
}
public abstract Object executeQuery(String sql);
}
// 使用示例
public class Application {
public static void main(String[] args) {
DatabaseDriver driver = new MySqlDriver();
JdbcTemplate template = new SimpleJdbcTemplate(driver);
template.executeQuery("SELECT * FROM users");
}
}
优缺点
优点:
- 分离抽象与实现,提高扩展性
- 避免多层继承导致的类爆炸
- 符合开闭原则和单一职责原则
- 实现细节对客户端透明
缺点:
- 增加系统复杂度
- 正确识别抽象和实现维度需要经验
- 需要额外设计工作
应用场景
- 需要在多个维度独立扩展的系统
- 避免绑定永久性实现
- 运行时切换实现
- 需要跨平台支持的库
- 数据库驱动、图形渲染等基础设施
与其他模式的关系
- 与适配器模式:都涉及组合,但桥接设计时分离关注点,适配器用于事后兼容
- 与抽象工厂模式:抽象工厂可创建和配置特定桥接
- 与状态模式:状态可视为桥接的特殊实现
- 与策略模式:策略可看作简化版桥接(单维度变化)
JDK 中的桥接模式
- AWT/Swing 中的 Peer 架构
- JDBC 驱动程序架构
- SLF4J 日志门面
- Java 虚拟机(JVM)规范与具体实现
注意事项
- 谨慎选择抽象和实现的边界
- 避免过度设计简单场景
- 考虑实现部分的线程安全问题
- 优先使用组合而非继承原则
- 注意实现部分的生命周期管理