桥接模式源码解析(jdk)
生活随笔
收集整理的這篇文章主要介紹了
桥接模式源码解析(jdk)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
現(xiàn)在我們來看一下橋接模式在源碼中的一些應(yīng)用,首先我們說一下,我們先看一個(gè)接口,首先我們看一下Driver的實(shí)現(xiàn)類,我們看到com.mysql.jdbc實(shí)現(xiàn)了Driver,添加了ORACLE的驅(qū)動(dòng),或者SQLServer的驅(qū)動(dòng)的話,那具體的MySQL的Driver,還有ORACLE的Driver,就是橋接模式的一部分,那JDBC如何獲取數(shù)據(jù)庫的連接呢,很簡單,我們打開DriverManager,也是sql包下的,private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();這里是一個(gè)CopyOnWriteArrayList,里面的類型是DriverInfo,是驅(qū)動(dòng)信息,我們看一下,這個(gè)類型里邊是如何封裝的,點(diǎn)開他,那在這里就可以看到,其實(shí)他是對(duì)Driver的具體封裝,包括他的hashCode,還有呢,構(gòu)造器,只不過把Driver作為DriverInfo的一個(gè)屬性,hashCode返回也是具體Driver的hashCode,那我們接著回來,那我們就可以理解DriverInfo就是一個(gè)Driver,DriverManager里面主要就是一個(gè)registerDriver這么一個(gè)方法,注冊(cè)驅(qū)動(dòng),public static synchronized void registerDriver(java.sql.Driver driver,DriverAction da)throws SQLException {/* Register the driver if it has not already been added to our list */if(driver != null) {registeredDrivers.addIfAbsent(new DriverInfo(driver, da));} else {// This is for compatibility with the original DriverManagerthrow new NullPointerException();}println("registerDriver: " + driver);}在Mysql里邊,我們通過classForName,然后com..mysql.jdbc.Driver,然后直接看一下Driver這個(gè)類,如果通過Class.forName的話,直接調(diào)用mysql里面的驅(qū)動(dòng)靜態(tài)塊static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } 然后調(diào)用DriverManager,這樣又回到這里邊了,這樣又回到這里邊了,具體又添加到了registeredDrivers注冊(cè)的驅(qū)動(dòng)里邊private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();那驅(qū)動(dòng)完成之后,我們?cè)倏匆幌逻@個(gè)類的getConnection方法,獲取具體的連接,那我們平時(shí)簡寫的時(shí)候,最多的就是getConnection,三個(gè)String的這么一個(gè)方法,這里面 要傳URL,用戶名,還有具體的密碼,通過這個(gè)靜態(tài)方法,來獲取數(shù)據(jù)庫的連接,那JDBC通過DriverManager對(duì)外提供了操作了數(shù)據(jù)庫的統(tǒng)一接口,getConnection,當(dāng)然這里也包含多個(gè)方法重載,那這個(gè)方法就可以獲取不同的數(shù)據(jù)庫連接,并且通過這個(gè)返回值,Connection這個(gè)類呢,里面提供方法對(duì)數(shù)據(jù)庫進(jìn)行操作,我們現(xiàn)在進(jìn)來了,我們看一下這里面有很多方法,執(zhí)行各種SQL語句使用的,那JDBC用不同的數(shù)據(jù)庫,提供了相同的接口,也就是我們這里邊的各種方法,無論是操作mysql,還是操作ORACLE,里面的方法是一樣的,只不過看一下他的實(shí)現(xiàn)類,第一個(gè)是Mysql的Connection接口,第二個(gè)是Mysql的具體的實(shí)現(xiàn),當(dāng)然我們可以發(fā)現(xiàn),DBDP的連接池,也實(shí)現(xiàn)了JDK原生下邊的Connection,如果pom里邊加載了ORALCE的驅(qū)動(dòng),還有SQLServer的驅(qū)動(dòng),也會(huì)找到對(duì)應(yīng)驅(qū)動(dòng)實(shí)現(xiàn)的,JDK中的Connection接口的,具體實(shí)現(xiàn)類,也就是針對(duì)不同的數(shù)據(jù)庫,通過DriverManager里的getConnection方法,獲取的都是相同的Connection接口的,也就是在JDBC最初設(shè)計(jì)的時(shí)候呢,設(shè)計(jì)了一套接口,再由各個(gè)數(shù)據(jù)庫公司自己來實(shí)現(xiàn),實(shí)現(xiàn)這個(gè)接口,我們?cè)僬{(diào)用的過程中,只需要使用接口來定義就可以了,那在具體的DriverManager里面,registerDriver這個(gè)方法,public static synchronized void registerDriver(java.sql.Driver driver,DriverAction da)throws SQLException {/* Register the driver if it has not already been added to our list */if(driver != null) {registeredDrivers.addIfAbsent(new DriverInfo(driver, da));} else {// This is for compatibility with the original DriverManagerthrow new NullPointerException();}println("registerDriver: " + driver);}那在這個(gè)方法中,就會(huì)找到接口真正的實(shí)現(xiàn)類,以此來實(shí)現(xiàn)數(shù)據(jù)庫真正的連接,而且DriverManager里面獲得的Connection,里面獲得PreparedStatement對(duì)象,等等呢,都是由Connection接口來進(jìn)行調(diào)用,但是底層返回的肯定是具體的,加載了mysql,那就返回具體的MYSQL的preparedStatement,他們所實(shí)現(xiàn)的實(shí)現(xiàn)類,那用這種橋接的模式呢,我們只需要修改Driver所修改的類,就可以了,例如com.mysql.jdbc.Driver,還有com.oracle,就可以很方便的在不同的數(shù)據(jù)庫之間,進(jìn)行轉(zhuǎn)化,那這個(gè)模式呢,正是橋接模式在JDK中的一些使用,而且還可以看出來,通過這種JDK中橋接模式的接口,設(shè)計(jì),很好的實(shí)現(xiàn)了開閉原則,無論有什么數(shù)據(jù)庫廠商,只要具體實(shí)現(xiàn)了JDBC接口的話,都可以接入到JAVA的數(shù)據(jù)庫操作當(dāng)中,所以在DriverManager這個(gè)類里邊,我們看一下,這個(gè)Driver是一個(gè)集合,而集合里面的元素呢,DriverInfo是對(duì)Driver的封裝,所以我們可以認(rèn)為,他就是Driver,所以DriverManager和具體的Driver之間,就實(shí)現(xiàn)了橋接模式,而Driver還有具體的Mysql Driver,Oracle Driver,等具體的Driver實(shí)現(xiàn),那希望你們對(duì)這塊呢,能加深印象,理解透徹
?
總結(jié)
以上是生活随笔為你收集整理的桥接模式源码解析(jdk)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 桥接模式coding
- 下一篇: 代理模式讲解