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

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

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

相关推荐
workflower1 天前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯1 天前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则
安冬的码畜日常1 天前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行
AI大法师2 天前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
晚安code2 天前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
workflower2 天前
从幻觉,到现实
人工智能·深度学习·机器学习·设计模式·机器人
电子科技圈2 天前
第二代无线平台历久弥新,赋能物联网创新迭代
人工智能·嵌入式硬件·mcu·物联网·设计模式·硬件架构·iot
choumin2 天前
创建型模式——工厂方法模式
c++·设计模式·工厂方法模式·创建型模式
choumin3 天前
创建型模式——原型模式
c++·设计模式·原型模式·创建型模式
37.2℃9953 天前
Claude Design哪个公司技术好
python·设计模式