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