大战设计模式(第二季)【7】———— 从源码看桥接模式

前言

桥接模式看到名字就很容易理解,就是用一座桥将两个类连接起来,为什么要这么做是它的关键。当我们两个抽象对象相互之间有联系,且两个抽象对象的具体实现有组合的关系,那么为了减少类的数量以及为了方便后续的扩展,使用桥接模式就非常有必要。

桥接模式基础:https://www.cnblogs.com/linkstar/p/7783497.html

从jdbc来看桥接模式


看到这张图是不是有点懵了,觉得非常负责,这个是jdbc和druid对应connection之间的联系结构图。

不要急,我们一点点来看。

我们先来看实现关系。

这是不是简单很多,其中Driver是一个接口,然后又两个对应的实现(这里只是举例,当然还有很多实现)一个实现是com.mysql.cj.jdbc.Driver另一个实现是DruidDriver。
如果你用过jdbc那其实对它应该不陌生,jdbc在建立连接的时候需要通过Driver去注册驱动,从而获得对应的连接。
com.mysql.cj.jdbc.Driver是为了拿到对应的连接,从而通过连接来执行对应的数据库操作,而Druid你应该不陌生了吧,它是我们用过的一个连接池,其中维护了数据库的连接,所以它也需要通过Driver去注册。

然后我们再来看DriverManager

DriverManager其中一个list用于维护的是一个DriverInfo的list,而这个DriverInfo就包含了我们上面说的Driver

好了到这里他们之间的关系你应该已经理清楚了,那么我们说的桥接模式到底在哪里呢?不要急我们先来说说jdbc的设计原理。

假设如果让你去设计java对于数据库的连接,你会怎么样去设计?

jdbc的一个思路就是,面对市场上面那么多数据库,作为一个语言本身我不可能为了每一个数据库去建立一个对应的连接管理方式方法,从而去满足各个数据库。所以java制定了一个对应的规范,让各个厂商自己去实现这样的规范,从而让用户体会到的就是,无论是哪个数据库,其实操作的方式方法都是一样的,这就是java去设计jdbc的原理。

所以对于Driver和Connection都是接口,各个厂商来实现这样的接口,从而在DriverManager在使用的时候,可以非常规范。

比如在获取连接的时候,其中标箭头的就是我们之前说的list,因为Driver的接口一致但实现不同,所以最后获得的连接不同,但是连接又具有相同的方法,从而最后在使用上面又是相同的。(绕进去没有?)

最后我们再来补充一下原来的图

哦,原来是这样~是不是有这种感觉,这里我们可以看到桥了。然后你再想想桥接模式给我们的定义,最后再看看最上面提到的最复杂的图,是不是就豁然开朗了。

总结

当两个抽象的事务产生联系,通过中间桥梁将二者联系在一起,这样非常方便后续的扩展也并不会影响当前的使用。

原文地址:https://www.cnblogs.com/linkstar/p/10535528.html