今天的博客主题
设计模式 ——》 设计模式之桥接模式
桥接模式 BP (Bridge Pattern)
定义
将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。
主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承往往违背了类的单一职责,复用性比较差。
桥接模式的核心在于解耦抽象和实现。
桥接模式是一个非常有用的模式,在桥接模式中体现了很多面向对象设计原则的思想,包括“单一职责原则”、“开闭原则”、“合成复用原则”、“里氏代换原则”、“依赖倒转原则”等。熟悉桥接模式有助于我们深入理解这些设计原则,也有助于我们形成正确的设计思想和培养良好的设计风格。
应用场景
当一个类内部具备两种以上变化维度时,使用桥接模式可以解耦这些变化的维度,使高层架构代码更稳定。
1)在抽象和具体实现之间需要增加更多的灵活性场景。
2)一个类存在两个或多个独立变化的维度,而且还都需要独立的进行扩展。
3)不希望使用继承,或因为多层继承导致系统类的个数剧增。
4)
优点
1)分离抽象部分及具体实现部分
2)提高系统的扩展性
3)符合开闭原则
4)符合合成复用原则
5)
缺点
1)增加系统的理解与设计难度
2)需要正确的识别系统中两个独立变化的维度
3)
源码中的应用
JDBC API: DriverManager
代码示例
桥接模式主要包含四种角色
抽象角色(abstraction):持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)
修正抽象角色(RefinedAbstraction):abstraction 的具体实现,对 abstraction 方法进行完善扩展。
实现角色(Implementor):确定实现维度的基本操作,提供给 abstraction 使用。该类一般为接口或者抽象类。
具体实现角色(ConcreteImplementor):Implementor 的具体实现。
// 抽象角色
abstract class Abstraction{
Implementor implementor;
public Abstraction(Implementor implementor){
this.implementor = implementor;
}
public void operation(){
this.implementor.operationImpl();
}
}
// 修正抽象角色
class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
@Override
public void operation() {
super.operation();
System.out.println("refined operation");
}
}
// 实现角色
interface Implementor{
void operationImpl();
}
// 具体实现角色
class ConcreteImplementorA implements Implementor{
@Override
public void operationImpl() {
System.out.println("I`M ConcreteImpl A");
}
}
// 客户端调用
public class BridgePattern {
public static void main(String[] args) {
// 具体实现角色
Implementor impl = new ConcreteImplementorA();
// 抽象角色,聚合实现
Abstraction abst = new RefinedAbstraction(impl);
// 操作
abst.operation();
}
}
// 输出结果
I`M ConcreteImpl A
refined operation