二十三种设计模式(七)--桥接模式

桥接模式(BRIDGE)

桥接模式属于结构型的设计模式, 主要目的将两种及以上个纬度的功能混在一起的大类或者类簇, 通过拆分纬度, 实现任意一个纬度都能独立扩展维护.

这个模式的难点在于, 我们能够正确合理地区分出确切可扩展的"维度".

以封装一个简单的数据库工具类似JDBC为例, 要面对的数据库种类有MySQL, Oracle, PostgreSQL等, 执行SQL语句的方式有普通执行, 批处理, 预编译处理等方式, 如果不用桥接模式, 将产生如下组合

复制代码
MySQLSimpleExecutor
MySQLPreparedExecutor
MySQLBatchExecutor

PostgresSimpleExecutor
PostgresPreparedExecutor
PostgresBatchExecutor

OracleSimpleExecutor
OraclePreparedExecutor
OracleBatchExecutor

数据库种类新增或执行方式新增, 都将面临大量新增类.

如下用桥接模式来改变这种局面.

首先定义数据库驱动接口DbDriver , 然后各种不同的数据库基于接口实现各自的连接器. 这样不同的数据库连接方式改变都能在单独的类中进行修改

java 复制代码
interface DbDriver {
    void connect();
    void execute(String sql);
}

class MySQLDriver implements DbDriver {
    @Override
    public void connect() {
        System.out.println("Connecting to MySQL...");
    }

    @Override
    public void execute(String sql) {
        System.out.println("MySQL 执行 SQL:" + sql);
    }
}

class OracleDriver implements DbDriver {
    @Override
    public void connect() {
        System.out.println("Connecting to Oracle...");
    }

    @Override
    public void execute(String sql) {
        System.out.println("Oracle 执行 SQL: " + sql);
    }
}

class PostgresDriver implements DbDriver {
    @Override
    public void connect() {
        System.out.println("Connecting to PostgreSQL...");
    }

    @Override
    public void execute(String sql) {
        System.out.println("PostgreSQL 执行 SQL:" + sql);
    }
}

然后定义抽象类, 定义各种数据库的SQL语句执行器, 抽象类中, 通过引用(protected DbDriver driver;)的方式将连接器 DbDriver 与执行器DbExecutor 桥接起来

java 复制代码
 abstract class DbExecutor {

    protected DbDriver driver;

    public DbExecutor(DbDriver driver) {
        this.driver = driver;
    }

    public abstract void run(String sql);
}

执行器的各自实现:

java 复制代码
class SimpleExecutor extends DbExecutor {

    public SimpleExecutor(DbDriver driver) {
        super(driver);
    }

    @Override
    public void run(String sql) {
        System.out.println("普通执行器");
        driver.connect();
        driver.execute(sql);
    }
}

class PreparedExecutor extends DbExecutor {

    public PreparedExecutor(DbDriver driver) {
        super(driver);
    }

    @Override
    public void run(String sql) {
        System.out.println("预编译语句执行器");
        driver.connect();
        System.out.println("进行 SQL 预编译...");
        driver.execute(sql);
    }
}

class BatchExecutor extends DbExecutor {
    public BatchExecutor (DbDriver driver) {
        super(driver);
    }

    @Override
    public void run(String sql) {
        System.out.println("批量语句执行器");
        driver.connect();
        driver.execute(sql);
    }
}

运行示例:

java 复制代码
public class BridgePattern {
    public static void main(String[] args) {
        DbDriver mysql = new MySQLDriver();
        DbExecutor simpleExec = new SimpleExecutor(mysql);
        simpleExec.run("SELECT * FROM user");
        System.out.println("");

        DbDriver postgres = new PostgresDriver();
        DbExecutor preparedExec = new PreparedExecutor(postgres);
        preparedExec.run("SELECT * FROM orders WHERE id=?");
        System.out.println("");

        DbDriver oracle = new OracleDriver();
        DbExecutor batchExec = new BatchExecutor(oracle);
        batchExec.run("UPDATE name FROM user WHERE id=?");
    }
}

运行效果:

复制代码
普通执行器
Connecting to MySQL...
MySQL 执行 SQL:SELECT * FROM user

预编译语句执行器
Connecting to PostgreSQL...
进行 SQL 预编译...
PostgreSQL 执行 SQL:SELECT * FROM orders WHERE id=?

批量语句执行器
Connecting to Oracle...
Oracle 执行 SQL: UPDATE name FROM user WHERE id=?

桥接模式的作用就是将多维度混杂的大类拆分为纬度独立的类, 每个纬度的类单独维护, 对其他纬度的类不会影响, 实现方便地扩展和灵活的维护, 对整体的影响大大降低.

相关推荐
长按助力退休15 小时前
设计模式实战,这 5 个最常用
设计模式
Carl_奕然17 小时前
【智能体】Agent的四种设计模式之:Multi-Agent Collaboration
设计模式
Lost of 程序猿17 小时前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
SL_staff18 小时前
合规性折旧:当知识资产因主权缺位在审计中‘功能性清零’
java·设计模式·开源
Zane19941 天前
工厂方法一定比简单工厂高级?三种工厂模式到底该怎么选
设计模式
Hespethorn1 天前
设计模式是语言缺陷的补丁 —— 从工厂、单例、策略三个模式说起
设计模式
Lost of 程序猿1 天前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
一只旭宝1 天前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
YYYing.1 天前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++
Zane19942 天前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式