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

桥接模式(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=?

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

相关推荐
高晶6 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
高晶6 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
延晗7 小时前
【从零开始 DeepSeek Harness 插件开发教程】二、一切皆插件:简单理解一下 Cordis 内核与 DSH 心智模型
设计模式·deepseek
高晶8 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
日和雫13 小时前
封装、继承、多态 & 组合,为什么组合大于继承?
设计模式
代钦塔拉16 小时前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
haluhalu.16 小时前
深入理解AIAgent(1.3)--- 设计模式
人工智能·python·设计模式·langchain
高晶2 天前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
博风2 天前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
代钦塔拉2 天前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式