设计初衷:将抽象和实现解耦,让它们可以独立变化。
更加贴切的理解:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
这里所说的抽象和实现,我们不能简单的理解为是Java中的接口和实现类,而是一个更加高维度的一个描述,或者可以说是抽象和具体两者的关系。
我们使用JDBC来操作数据库时会有很多模板式的代码。例如加载驱动,获取连接,执行sql等等。其实大部分的操作最终都是委托给具体的Driver类来执行的,因此我们完全可以直接替换驱动类来决定使用Mysql还是Oracle数据库,而不需要改动或者只需要改动很少的代码。
对于JDBC这个模块来说,它不是一个Java定义的interface,但是它从语义上来说是抽象的,它是Java规范定义的操作数据库的规范,但是它并不是一个简单的接口,但是可以理解为一个更加广义的“接口”。
从以上的角度来说,具体数据库厂商的驱动类就是这个更为广义的“接口”的实现类了,而这个实现类也更为复杂,它必须实现整个JDBC的规范,一个完整的操作数据库的规范。在JDBC中是通过组合DriverManager委派来实现的(与具体的驱动一样实现了Driver接口)。
桥接模式,其实代码结构是比较简单的。通过组合的方式来引入实现模块,使得抽象和具体解耦。其难点还是在于理解抽象和具体的关系,区别于Java中的interface和实现类。