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

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

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

相关推荐
咖啡八杯5 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
:mnong9 小时前
学习创建结构行为设计模式
设计模式
w_t_y_y11 小时前
Agent设计模式(四)多模态融合模式(Multi-Modal Fusion)
设计模式
zhouhui00112 小时前
订单状态的 if-else 地狱上线就崩——状态模式的工业级落地
设计模式
geovindu13 小时前
go: Reactor Pattern
开发语言·后端·设计模式·golang·反应器模式
一只旭宝1 天前
【C++入门精讲22】常见设计模式
c++·设计模式
许彰午1 天前
38_Java设计模式之装饰器模式
java·设计模式·装饰器模式
geovindu1 天前
python: Reactor Pattern
开发语言·python·设计模式·反应器模式
workflower1 天前
基于机器学习的设备故障预测分析方法
人工智能·算法·机器学习·设计模式·语言模型·自然语言处理·重构
迷茫运维路2 天前
Golang架构目录设计与设计模式教程
设计模式·golang