桥接模式(Bridge)
1、概述
桥接模式是一种结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。也可描述为抽象化与实现化解耦,使得二者可以独立变化。
2、重点
核心思想是:将继承模式转化成关联关系,降低了类与类之间的耦合度。将两个角色之间的继承关系修改为关联关系,强关联改换成弱关联。
3、优缺点
优点
- 分离抽象接口及其实现部分,降低了系统耦合度。
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原来的系统。
- 实现细节对客户不透明,可以隐藏实现细节。
缺点
- 桥接模式的引入会增加系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行编程。
4、场景
- 一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
5、实例
桥梁模式在Java应用中一个非常典型的例子就是JDBC驱动器。JDBC为所有的关系型数据库提供一个通用的界面。一个应用系统动态的选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象角色的行为委派给实现角色的过程。
本例也采用数据库连接的一个样例,系统开发中涉及到需要连接多个数据库的问题,假设系统需要同时连接oracle和mysql两种类型数据库:
public interface Driver {
public void connect();
}
public class OracleDriver implements Driver {
@Override
public void connect() {
System.out.println("连接oracle。。。");
}
}
public class MysqlDriver implements Driver{
@Override
public void connect() {
System.out.println("连接mysql。。。");
}
}
public class Bridge {
private Driver driver;
public Driver getDriver() {
return driver;
}
public void setDriver(Driver driver) {
this.driver = driver;
}
}
public class BridgeTest {
public static void main(String[] args) {
//oracle
Bridge oracleBridge = new Bridge();
Driver oracleDriver = new OracleDriver();
oracleBridge.setDriver(oracleDriver);
oracleDriver.connect();
//mysql
Bridge mysqlBridge = new Bridge();
Driver mysqlDriver = new MysqlDriver();
mysqlBridge.setDriver(mysqlDriver);
mysqlDriver.connect();
}
}