這里摘抄一份他處的概念,你可以不必理會(huì),先看下面得講解與實(shí)例,然后返回來(lái)理解概念,不然抽象的概念會(huì)讓你崩潰...
橋接(Bridge)是用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解耦。
這種模式涉及到一個(gè)作為橋接的接口,使得實(shí)體類(lèi)的功能獨(dú)立于接口實(shí)現(xiàn)類(lèi)。這兩種類(lèi)型的類(lèi)可被結(jié)構(gòu)化改變而互不影響。
個(gè)人理解:橋接是一個(gè)接口,它與一方應(yīng)該是綁定的,也就是解耦的雙方中的一方必然是繼承這個(gè)接口的,這一方就是實(shí)現(xiàn)方,而另一方正是要與這一方解耦的抽象方,如果不采用橋接模式,一般我們的處理方式是直接使用繼承來(lái)實(shí)現(xiàn),這樣雙方之間處于強(qiáng)鏈接,類(lèi)之間關(guān)聯(lián)性極強(qiáng),如要進(jìn)行擴(kuò)展,必然導(dǎo)致類(lèi)結(jié)構(gòu)急劇膨脹。采用橋接模式,正是為了避免這一情況的發(fā)生,將一方與橋綁定,即實(shí)現(xiàn)橋接口,另一方在抽象類(lèi)中調(diào)用橋接口(指向的實(shí)現(xiàn)類(lèi)),這樣橋方可以通過(guò)實(shí)現(xiàn)橋接口進(jìn)行單方面擴(kuò)展,而另一方可以繼承抽象類(lèi)而單方面擴(kuò)展,而之間的調(diào)用就從橋接口來(lái)作為突破口,不會(huì)受到雙方擴(kuò)展的任何影響。
下面的實(shí)例能真正體現(xiàn)著一點(diǎn):
實(shí)例準(zhǔn)備:我們假設(shè)有一座橋,橋左邊為A,橋右邊為B,A有A1,A2,A3等,表示橋左邊的三個(gè)不同地方,B有B1,B2,B3等,表示橋右邊的三個(gè)不同地方,假設(shè)我們要從橋左側(cè)A出發(fā)到橋的右側(cè)B,我們可以有多重方案,A1到B1,A1到B2,A1到B3,A2到B1...等等,以此為例,代碼如下:
橋接口:Qiao
public interface Qiao {
//目的地B
? ? void targetAreaB();
}
目的地B1,B2,B3:
/**
* 目的地B1
*/
public class TargetAreaB1implements Qiao {
@Override
? ? public void targetAreaB() {
System.out.println("我要去B1");
? ? }
}
/**
* 目的地B2
*/
public class TargetAreaB2implements Qiao {
@Override
? ? public void targetAreaB() {
System.out.println("我要去B2");
? ? }
}
/**
* 目的地B3
*/
public class TargetAreaB3implements Qiao {
@Override
? ? public void targetAreaB() {
System.out.println("我要去B3");
? ? }
}
抽象來(lái)源地:SourceAreaA
public abstract class SourceAreaA {
//引用橋接口
? ? Qiaoqiao;
? ? //來(lái)源地
? ? abstract void fromAreaA();
}
來(lái)源地A1,A2,A3:
/**
* 來(lái)源地A1
*/
public class SourceAreaA1extends SourceAreaA {
@Override
? ? void fromAreaA() {
System.out.println("我來(lái)自A1");
? ? }
}
/**
* 來(lái)源地A2
*/
public class SourceAreaA2extends SourceAreaA {
@Override
? ? void fromAreaA() {
System.out.println("我來(lái)自A2");
? ? }
}
/**
* 來(lái)源地A3
*/
public class SourceAreaA3extends SourceAreaA {
@Override
? ? void fromAreaA() {
System.out.println("我來(lái)自A3");
? ? }
}
客戶端:Clienter
public class Clienter {
public static void main(String[] args) {
SourceAreaA a =new SourceAreaA2();
? ? ? ? a.qiao =new TargetAreaB3();
? ? ? ? a.fromAreaA();
? ? ? ? a.qiao.targetAreaB();
? ? }
}
運(yùn)行結(jié)果:

如何,只要你認(rèn)真看完了實(shí)例,你就明白了這種模式的好處,現(xiàn)在我們要添加來(lái)源地和目的地,只要繼續(xù)繼承AreaA和實(shí)現(xiàn)Qiao即可,之前我所說(shuō)的綁定,正式此處將橋與目的地綁定在一起,使用一個(gè)接口完成。
其實(shí)要完成橋接模式,注意點(diǎn)并不多,重在理解模式的使用場(chǎng)景。
注意點(diǎn):
1、定義一個(gè)橋接口,使其與一方綁定,這一方的擴(kuò)展全部使用實(shí)現(xiàn)橋接口的方式。
2、定義一個(gè)抽象類(lèi),來(lái)表示另一方,在這個(gè)抽象類(lèi)內(nèi)部要引入橋接口,而這一方的擴(kuò)展全部使用繼承該抽象類(lèi)的方式。
其實(shí)我們可以發(fā)現(xiàn)橋接模式應(yīng)對(duì)的場(chǎng)景有方向性的,橋綁定的一方都是被調(diào)用者,屬于被動(dòng)方,抽象方屬于主動(dòng)方。
其實(shí)我的JDK提供的JDBC數(shù)據(jù)庫(kù)訪問(wèn)接口API正是經(jīng)典的橋接模式的實(shí)現(xiàn)者,接口內(nèi)部可以通過(guò)實(shí)現(xiàn)接口來(lái)擴(kuò)展針對(duì)不同數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn)來(lái)進(jìn)行擴(kuò)展,而對(duì)外的僅僅只是一個(gè)統(tǒng)一的接口調(diào)用,調(diào)用方過(guò)于抽象,可以將其看做每一個(gè)JDBC調(diào)用程序(這是真實(shí)實(shí)物,當(dāng)然不存在抽象)
下面來(lái)理解一下開(kāi)頭的概念:
橋接(Bridge)是用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解耦。
這種模式涉及到一個(gè)作為橋接的接口,使得實(shí)體類(lèi)的功能獨(dú)立于接口實(shí)現(xiàn)類(lèi)。這兩種類(lèi)型的類(lèi)可被結(jié)構(gòu)化改變而互不影響。
理解:此處抽象化與實(shí)現(xiàn)化分別指代實(shí)例中的雙方,而且實(shí)現(xiàn)化對(duì)應(yīng)目的地方(通過(guò)實(shí)現(xiàn)橋接口進(jìn)行擴(kuò)展),抽象方對(duì)應(yīng)來(lái)源地方(通過(guò)繼承抽象類(lèi)來(lái)進(jìn)行擴(kuò)展),如果我們不使用橋接模式,我們會(huì)怎么想實(shí)現(xiàn)這個(gè)實(shí)例呢?很簡(jiǎn)單,我們分別定義來(lái)源地A1、A2、A3類(lèi)和目的地B1、B2、B3,然后具體的實(shí)現(xiàn)就是,A1到B1一個(gè)類(lèi),A1到B2一個(gè)類(lèi),等,如果我們要擴(kuò)展了A和B ,要直接增加An類(lèi)和Bn類(lèi),如此編寫(xiě)不說(shuō)類(lèi)內(nèi)部重復(fù)性代碼多,而且還會(huì)導(dǎo)致類(lèi)結(jié)構(gòu)的急劇膨脹,最重要的是,在通過(guò)繼承實(shí)現(xiàn)路徑的時(shí)候,會(huì)造成雙方耦合性增大,而這又進(jìn)一步加劇了擴(kuò)展的復(fù)雜性。使用橋結(jié)構(gòu)模式可以很好地規(guī)避這些問(wèn)題:重在解耦。