桥接模式是一种结构型设计模式。桥接模式的思想是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合。
桥接模式涉及4个角色:
- 抽象桥(Abstraction):客户与实现之间的中间连接,指向抽象实现。
- 具体桥(Refined Abstraction):桥的实现类。
- 抽象实现(Implementor):实现(这里的实现不是指实现类,是对某个功能的实现)的抽象接口。
- 具体实现(Concrete Implementor):某个功能具体的实现。
结构图:
具体代码实现:
实现:
public interface Implementor {
void method();
}
public class ConcreteImplementorA implements Implementor {
@Override
public void method() {
System.out.println("this is A");
}
}
public class ConcreteImplementorB implements Implementor {
@Override
public void method() {
System.out.println("this is B");
}
}
桥:
public abstract class AbstractBridge {
private Implementor impl;
public Implementor getImpl() { return impl; }
public void setImpl(Implementor impl) { this.impl = impl; }
public abstract void method();
}
public class Bridge extends AbstractBridge {
@Override
public void method() {
getImpl().method();
}
}
客户:
public class Client {
public void use(AbstractBridge bridge) {
bridge.method();
}
}
// 测试
class BridgeTest {
public static void main(String[] args) {
Client client = new Client();
AbstractBridge bridge = new Bridge();
// 实现A
bridge.setImpl(new ConcreteImplementorA());
client.use(bridge);
// 实现B
bridge.setImpl(new ConcreteImplementorB());
client.use(bridge);
}
}
运行结果:
this is A
this is B
应用场景:
- 当不希望在抽象和实现部分采用固定的绑定关系时,可以采用桥接模式,来把抽象和实现部分分开,然后在程序运行期间来动态的设置抽象部分需要用到的具体实现,还可以动态切换具体的实现。
- 如果出现抽象部分和实现部分都可以扩展的情况下,可以采用桥接模式,让抽象部分和实现部分可以独立的变化,从而可以灵活的进行单独扩展,而不是搅在一起,扩展一边可以影响另一边。
- 当希望实现部分的修改,不会对客户产生影响时,可以采用桥接模式,客户是面向抽象的接口在运行,实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。
- 如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的维度,然后通过桥接模式来分离他们,从而减少子类的数目。
- 一个典型的桥接模式应用例子:JDCB的DriverManager。
DriverManager
这个类就是桥,具体的MysqlDriver
,OracleDriver
等就是具体的实现。具体可以阅读源码。