Skip to content

桥接

更新: 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");
    }
}

优缺点

优点:

  1. 分离抽象与实现,提高扩展性
  2. 避免多层继承导致的类爆炸
  3. 符合开闭原则和单一职责原则
  4. 实现细节对客户端透明

缺点:

  1. 增加系统复杂度
  2. 正确识别抽象和实现维度需要经验
  3. 需要额外设计工作

应用场景

  1. 需要在多个维度独立扩展的系统
  2. 避免绑定永久性实现
  3. 运行时切换实现
  4. 需要跨平台支持的库
  5. 数据库驱动、图形渲染等基础设施

与其他模式的关系

  • 与适配器模式:都涉及组合,但桥接设计时分离关注点,适配器用于事后兼容
  • 与抽象工厂模式:抽象工厂可创建和配置特定桥接
  • 与状态模式:状态可视为桥接的特殊实现
  • 与策略模式:策略可看作简化版桥接(单维度变化)

JDK 中的桥接模式

  1. AWT/Swing 中的 Peer 架构
  2. JDBC 驱动程序架构
  3. SLF4J 日志门面
  4. Java 虚拟机(JVM)规范与具体实现

注意事项

  1. 谨慎选择抽象和实现的边界
  2. 避免过度设计简单场景
  3. 考虑实现部分的线程安全问题
  4. 优先使用组合而非继承原则
  5. 注意实现部分的生命周期管理

贡献者

The avatar of contributor named as AKAcxp AKAcxp

页面历史