桥接模式(Bridge Pattern)通过将抽象及其实现解耦,使二者可以根据需求独立变化。这种类型的设计模式属于结构型模式,通过定义一个抽象和实现之间的桥接者来达到解耦的目的。
桥接模型主要用于解决在需求多变的情况下使用继承造成类爆炸的问题,扩展起来不够灵活。可以通过桥接模式将抽象部分与实现部分分离,使其能够独立变化而相互之间的功能不受影响。具体做法是通过定义一个桥接接口,使得实体类的功能独立于接口实现类,降低它们之间的耦合度。
常用的JDBC和DriverManager就使用了桥接模式,JDBC在连接数据库时,在各个数据库之间进行切换而不需要修改代码,因为JDBC提供了统一的接口Driver,每个数据库都提供了各自的实现,通过一个叫作数据库驱动的程序来桥接即可。以数据库连接为例,UML设计图如下:
1)定义Driver接口:
public interface Driver {
void executeSQL();
}
2)定义Driver接口的MySQL实现类MysqlDriver:
@Slf4j
public class MySQLDriver implements Driver {
@Override
public void executeSQL() {
log.info("execute sql by mysql driver...");
}
}
3)定义Driver接口的Oracle实现类OracleDriver:
@Slf4j
public class OracleDriver implements Driver {
@Override
public void executeSQL() {
log.info("execute sql by oracle driver...");
}
}
4)定义抽象类DriverManagerBridge,用于实现桥接模式,该类定义了Driver的注入,用户注入不同的驱动器便能实现不同类型的数据库的切换:
public abstract class DriverManagerBridge {
private Driver driver;
public Driver getDriver() {
return driver;
}
public void setDriver(Driver driver) {
this.driver = driver;
}
public void execute() {
this.driver.executeSQL();
}
}
5)定义MyDriverBridge:
public class MyDriverBridge extends DriverManagerBridge {
@Override
public void execute() {
getDriver().executeSQL();
}
}
6)测试桥接模式:
package cn.jaa.bridge_pattern;
/**
* @Author: Jaa
* @Description:
* @Date 2023/11/30
*/
public class BridgeDemoTest {
public static void main(String[] args) {
DriverManagerBridge driverBridge = new MyDriverBridge();
// set MySQL driver
driverBridge.setDriver(new MySQLDriver());
driverBridge.execute();
// switch Oracle driver
driverBridge.setDriver(new OracleDriver());
driverBridge.execute();
}
}
运行结果: