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

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

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

相关推荐
AI人工智能+电脑小能手12 小时前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
嘟嘟071714 小时前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
SL_staff15 小时前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
Asize15 小时前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs
St_rive1 天前
Page Object设计模式
java·开发语言·设计模式
烬羽2 天前
NestJS 依赖注入:Controller 里那个没有 new 的 service,到底从哪来的?
设计模式·typescript·nestjs
用户938515635072 天前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
烬羽2 天前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉3 天前
从if-else到策略模式
后端·设计模式
小林ixn3 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式