桥接模式是一种结构型设计模式,英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:Decouple an abstraction from its implementation so that the two can vary independently。翻译成中文就是:将抽象和实现解耦,让它们可以独立变化。单从官方概念来理解,相当晦涩,通常对抽象与实现的第一反应就是接口(或抽象类)与实现类的继承关系,接口和实现独立变化就更加让人难以理解。
关于桥接模式,还有另外一种理解方式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。再配合类图(https://zh.wikipedia.org/wiki/%E6%A9%8B%E6%8E%A5%E6%A8%A1%E5%BC%8F)就比较容易理解一些。
桥接模式所涉及的角色有:
- 抽象(Abstraction)角色:抽象角色,采用抽象类方式,并持有一个实现角色对象的引用。
- 具体抽象(RefinedAbstraction)角色:具体抽象角色具体实现。
- 实现(Implementor)角色:给出实现角色的接口。实现化角色应当只给出抽象层操作,抽象角色持有抽象角色并只给出基于抽象角色的操作。
- 具体实现(ConcreteImplementor)角色:这个角色给出实现角色接口的具体实现。
可以看到抽象和实现是两个角色,是调用者和被调用者的关系,通过组合关系使抽象角色持有实现角色,通过组合关系来替代继承关系,避免继承层次过多。
接下来通过代码理解一下桥接模式,当我们办理银行卡时,有不同的银行(工商银行,建设银行)可选择,每个银行有不同的卡(储蓄卡,信用卡),所以银行和卡就相当于两个独立变化的维度,我们将银行和卡进行抽象,将银行作为抽象角色,将卡作为实现角色,通过组合的方式使银行持有卡的接口引用,将其组合在一起。
public class BridgePattern {
/**
* 银行抽象类,桥接模式的抽象部分
*/
abstract static class Bank {