




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Java設(shè)計(jì)模式之橋接模式本文通過老王和小王買車,引出設(shè)計(jì)模式中的結(jié)構(gòu)型設(shè)計(jì)之橋接模式,接著說明設(shè)計(jì)型模式的概念和代碼實(shí)現(xiàn),為了加深理解,會(huì)說明適配器設(shè)計(jì)模式在JDBC中的應(yīng)用,最后談?wù)剺蚪幽J胶瓦m配器模式的總結(jié)。
讀者可以拉取完整代碼到本地進(jìn)行學(xué)習(xí),實(shí)現(xiàn)代碼均測(cè)試通過后上傳到碼云,本地源碼下載。
一、引出問題
老王和小王去奔馳4S店買車,奔馳4S店的各種品牌型號(hào)琳瑯滿目,老王想試駕奔馳E、小王想試駕奔馳G,并且提出兩種奔馳型號(hào)的各種顏色都想體驗(yàn)一把,這讓店小二犯了難,兩兩組合就是很多種,4S店壓根放不下。
無奈店小二求救經(jīng)理,經(jīng)理出了一個(gè)注意:將奔馳E和G開的品牌抽象出來,將顏色也抽象出來,通過品牌和顏色的組合代替繼承關(guān)系,減少了顏色和品牌的耦合,且減少了車的個(gè)數(shù),只需要兩臺(tái)就夠了。
果然經(jīng)理不愧是經(jīng)理。
經(jīng)理所說的其實(shí)就是橋接模式。這種模式涉及到一個(gè)作為橋接的接口,使得實(shí)體類的功能獨(dú)立于接口實(shí)現(xiàn)類。這兩種類型的類可被結(jié)構(gòu)化改變而互不影響。
二、概念與使用
我們看一些概念:橋接(Bridge)是用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來實(shí)現(xiàn)二者的解耦。
在該模式中應(yīng)該涉及到四個(gè)角色:
①實(shí)現(xiàn)類接口(Implementor):定義實(shí)現(xiàn)角色的接口,供擴(kuò)展抽象化角色使用,例如抽象出奔馳品牌benz可以擴(kuò)展出benzEbenzG
②具體實(shí)現(xiàn)角色(ConcreteImplementor):實(shí)現(xiàn)類的具體實(shí)現(xiàn),例如各種奔馳品牌
③抽象化(Abstraction)角色:定義一個(gè)抽象類,其中引用了實(shí)現(xiàn)化角色(想要組合),例如汽車產(chǎn)品
④擴(kuò)展抽象化(RefinedAbstraction)角色:抽象化角色子類,實(shí)現(xiàn)父類方法,且通過組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法,例如具體奔馳產(chǎn)品,紅色奔馳、白色奔馳
根據(jù)該模式的定義,我們將奔馳品牌抽象出來,然后各品牌有各自的實(shí)現(xiàn),每個(gè)顏色的車把車品牌組合進(jìn)來,在客戶端中每個(gè)相機(jī)類型和相機(jī)品牌都能兩兩組合。
我們看具體的代碼實(shí)現(xiàn):
實(shí)現(xiàn)類接口:
/**
*奔馳品牌類
*@authortcy
*@Date05-08-2025
publicinterfaceBenzBrand{
voidshowInfo();
}
具體實(shí)現(xiàn)角色1:
/**
*@authortcy
*@Date05-08-2025
publicclassBenzEimplementsBenzBrand{
@Override
publicvoidshowInfo(){
System.out.print("【奔馳E】顏色是:");
}
具體實(shí)現(xiàn)角色2:
/**
*@authortcy
*@Date05-08-2025
publicclassBenzGimplementsBenzBrand{
@Override
publicvoidshowInfo(){
System.out.print("【奔馳G】顏色是:");
}
抽象化角色:
/**
*抽象奔馳類
*@authortcy
*@Date05-08-2025
publicabstractclassBenz{
//將品牌組合進(jìn)來
protectedBenzBrandbenzBrand;
publicBenz(BenzBrandbenzBrand){
this.benzBrand=benzBrand;
publicvoidshowInfo(){
benzBrand.showInfo();
}
擴(kuò)展抽象化1:
/**
*@authortcy
*@Date05-08-2025
publicclassBlackBenzextendsBenz{
publicBlackBenz(BenzBrandbenzBrand){
super(benzBrand);
@Override
publicvoidshowInfo(){
super.showInfo();
System.out.println("黑色...");
}
擴(kuò)展抽象化2:
/**
*@authortcy
*@Date05-08-2025
publicclassRedBenzextendsBenz{
publicRedBenz(BenzBrandbenzBrand){
super(benzBrand);
@Override
publicvoidshowInfo(){
super.showInfo();
System.out.println("紅色...");
}
客戶端調(diào)用:
/**
*@authortcy
*@Date05-08-2025
publicclassClient{
publicstaticvoidmain(String[]args){
//黑色奔馳E
Benzbenz1=newBlackBenz(newBenzE());
benz1.showInfo();
//黑色奔馳G
Benzbenz2=newBlackBenz(newBenzG());
benz2.showInfo();
//紅色奔馳E
Benzbenz3=newRedBenz(newBenzE());
benz3.showInfo();
//紅色奔馳G
Benzbenz4=newRedBenz(newBenzG());
benz4.showInfo();
}
【奔馳E】顏色是:黑色...
【奔馳G】顏色是:黑色...
【奔馳E】顏色是:紅色...
【奔馳G】顏色是:紅色...
這樣即使老王提出來新的顏色、新的車型,只需要增加相應(yīng)的具體實(shí)現(xiàn)角色或者擴(kuò)展抽象化角色即可。
顧名思義,橋接模式就像是一個(gè)橋,可以用來連接兩個(gè)不同地方,這兩個(gè)地方自由發(fā)展,中間的貿(mào)易是通過一座橋來連接。
這種方法的缺點(diǎn)也很顯著,汽車能很快的確立型號(hào)和顏色兩個(gè)維度,在實(shí)際業(yè)務(wù)開發(fā)中,識(shí)別出系統(tǒng)兩個(gè)獨(dú)立變化的維度就不簡單了。
不難看出,列舉的例子有些過于強(qiáng)求,在現(xiàn)實(shí)世界中是永遠(yuǎn)不可能發(fā)生的,為了加深理解我找了大量在JDK亦或是Spirng等各種框架對(duì)橋接模式的應(yīng)用,只找到了橋接模式在Jdbc中的應(yīng)用。
我們都知道通過JDBC可以完成Java對(duì)關(guān)系型數(shù)據(jù)庫的SQL操作,我們?cè)谶B接數(shù)據(jù)數(shù)據(jù)庫時(shí),想必都接觸過Driver,在連接MySQL和Oracle的Driver都是不同的,這些都是實(shí)現(xiàn)接口類。
我們看一下MySQL中實(shí)現(xiàn)的Driver類。
publicclassDriverextendsNonRegisteringDriverimplementsjava.sql.Driver{
publicDriver()throwsSQLException{
static{
try{
DriverManager.registerDriver(newDriver());
}catch(SQLExceptionvar1){
thrownewRuntimeException("Can'tregisterdriver!");
}
在該類中實(shí)際上有兩個(gè)作用,一是調(diào)用了DriverManager中的registerDriver方法來注冊(cè)驅(qū)動(dòng),二是當(dāng)驅(qū)動(dòng)注冊(cè)完成后,我們就會(huì)開始調(diào)用DriverManager中的getConnection方法了。
我們看DriverManager的完整代碼:
publicclassDriverManager{
publicstaticConnectiongetConnection(Stringurl,
Stringuser,Stringpassword)throwsSQLException{
java.util.Propertiesinfo=newjava.util.Properties();
if(user!=null){
info.put("user",user);
if(password!=null){
info.put("password",password);
return(getConnection(url,info,Reflection.getCallerClass()));
privatestaticConnectiongetConnection(
Stringurl,java.util.Propertiesinfo,Classcaller)throwsSQLException{
*WhencallerClisnull,weshouldchecktheapplication's
*(whichisinvokingthisclassindirectly)
*classloader,sothattheJDBCdriverclassoutsidert.jar
*canbeloadedfromhere.
ClassLoadercallerCL=caller!=nullcaller.getClassLoader():null;
synchronized(DriverManager.class){
//synchronizeloadingofthecorrectclassloader.
if(callerCL==null){
callerCL=Thread.currentThread().getContextClassLoader();
if(url==null){
thrownewSQLException("Theurlcannotbenull","08001");
println("DriverManager.getConnection(\""+url+"\")");
//WalkthroughtheloadedregisteredDriversattemptingtomakeaconnection.
//Rememberthefirstexceptionthatgetsraisedsowecanreraiseit.
SQLExceptionreason=null;
for(DriverInfoaDriver:registeredDrivers){
//Ifthecallerdoesnothavepermissiontoloadthedriverthen
//skipit.
if(isDriverAllowed(aDriver.driver,callerCL)){
try{
println("trying"+aDriver.driver.getClass().getName());
Connectioncon=aDriver.driver.connect(url,info);
if(con!=null){
//Success!
println("getConnectionreturning"+aDriver.driver.getClass().getName());
return(con);
}catch(SQLExceptionex){
if(reason==null){
reason=ex;
}else{
println("skipping:"+aDriver.getClass().getName());
//ifwegotherenobodycouldconnect.
if(reason!=null){
println("getConnectionfailed:"+reason);
throwreason;
println("getConnection:nosuitabledriverfoundfor"+url);
thrownewSQLException("Nosuitabledriverfoundfor"+url,"080
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流行業(yè)高效配送管理方案
- 2025年征信考試題庫(征信數(shù)據(jù)分析與報(bào)告撰寫)征信業(yè)務(wù)風(fēng)險(xiǎn)管理試題
- 分形理論視角下上海證券市場(chǎng)有效性的深度剖析與實(shí)證研究
- 七氟醚預(yù)處理與后處理對(duì)腎下腹主動(dòng)脈缺血再灌注致肺損傷的差異剖析與機(jī)制探究
- 風(fēng)電運(yùn)維設(shè)備故障診斷技術(shù)2025年研究報(bào)告
- 青藍(lán)工程徒弟計(jì)劃
- 高管認(rèn)知偏差干預(yù)-洞察及研究
- 知識(shí)管理數(shù)字化-洞察及研究
- 化學(xué)使世界變得更加絢麗多彩教案
- 農(nóng)場(chǎng)土地合同
- 2025年果皮干燥行業(yè)深度研究報(bào)告
- 2025-2030年中國語言培訓(xùn)行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及發(fā)展趨勢(shì)與投資研究報(bào)告
- 糧食安全與危機(jī)
- 《焊接技術(shù)及工藝》課件
- GA/T 2157-2024毛細(xì)管電泳遺傳分析儀
- 頭療店鋪轉(zhuǎn)讓合同協(xié)議
- 生產(chǎn)現(xiàn)場(chǎng)6S管理培訓(xùn)課件
- 人力資源公司加盟合同
- 2025年交管12123學(xué)法減分考試題庫500題(含答案)
- 2025高考數(shù)學(xué)專項(xiàng)復(fù)習(xí):洛必達(dá)法則(含答案)
- 壓瘡的識(shí)別及護(hù)理
評(píng)論
0/150
提交評(píng)論