橋梁模式是為了解決將抽象部分與實(shí)現(xiàn)部分分離,好讓他們都在自己的維度上有多維度地變化。
為了充分理解上面的含義,舉個(gè)例子來(lái)說(shuō)明,假如市面上電視和遙控器來(lái)自不同產(chǎn)家,遙控器要實(shí)現(xiàn)針對(duì)每個(gè)不同的電視需要不同的遙控器,那么我們可能看到如下的結(jié)果

每個(gè)具體的遙控器都去繼承或是實(shí)現(xiàn)遙控器的抽象或是接口,并且在每個(gè)具體的遙控器內(nèi)部都聚合了各自的電視機(jī)接口。這種方案可以解決問(wèn)題,可以解決遙控器與電視機(jī)的對(duì)應(yīng)關(guān)系??墒?,卻有一個(gè)問(wèn)題,就像上面場(chǎng)景中所說(shuō)的,如果這里的有一些新的電視機(jī)出現(xiàn),那么生產(chǎn)遙控器的產(chǎn)商還得去生產(chǎn)新的遙控器。這樣一來(lái)各自的遙控器數(shù)量不但不好把握,而且這樣的設(shè)計(jì)很繁雜
下面開(kāi)始橋梁模式,首先看下 UML 類圖

Abstraction(抽象類):用于定義抽象類的接口,它一般是抽象類而不是接口,其中定義了一個(gè)Implementor(實(shí)現(xiàn)類接口)類型的對(duì)象并可以維護(hù)該對(duì)象,它與Implementor之間具有關(guān)聯(lián)關(guān)系,它既可以包含抽象業(yè)務(wù)方法,也可以包含具體業(yè)務(wù)方法。
RefinedAbstraction(擴(kuò)充抽象類):擴(kuò)充由Abstraction定義的接口,通常情況下它不再是抽象類而是具體類,它實(shí)現(xiàn)了在Abstraction中聲明的抽象業(yè)務(wù)方法,在RefinedAbstraction中可以調(diào)用在Implementor中定義的業(yè)務(wù)方法。
Implementor(實(shí)現(xiàn)類接口):定義實(shí)現(xiàn)類的接口,這個(gè)接口不一定要與Abstraction的接口完全一致,事實(shí)上這兩個(gè)接口可以完全不同,一般而言,Implementor接口僅提供基本操作,而Abstraction定義的接口可能會(huì)做更多更復(fù)雜的操作。Implementor接口對(duì)這些基本操作進(jìn)行了聲明,而具體實(shí)現(xiàn)交給其子類。通過(guò)關(guān)聯(lián)關(guān)系,在Abstraction中不僅擁有自己的方法,還可以調(diào)用到Implementor中定義的方法,使用關(guān)聯(lián)關(guān)系來(lái)替代繼承關(guān)系。
ConcreteImplementor(具體實(shí)現(xiàn)類):具體實(shí)現(xiàn)Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同實(shí)現(xiàn),在程序運(yùn)行時(shí),ConcreteImplementor對(duì)象將替換其父類對(duì)象,提供給抽象類具體的業(yè)務(wù)操作方法。
再舉個(gè)例子來(lái)看,比如畫筆有類型不同,顏色不同;那么類型中也有可能新增,顏色也有可能新增,如何設(shè)計(jì)這個(gè)情況

如果需要增加一種新型號(hào)的毛筆,只需擴(kuò)展左側(cè)的“抽象部分”,增加一個(gè)新的擴(kuò)充抽象類;如果需要增加一種新的顏色,只需擴(kuò)展右側(cè)的“實(shí)現(xiàn)部分”,增加一個(gè)新的具體實(shí)現(xiàn)類。擴(kuò)展非常方便,無(wú)須修改已有代碼,且不會(huì)導(dǎo)致類的數(shù)目增長(zhǎng)過(guò)快。
代碼過(guò)一遍,首先把毛筆抽象類寫出
public abstract class Maobi {
protected MyColor color;
public void setColor(MyColor color){
this.color=color;
}
public abstract void paint();
}
把具體的兩個(gè)毛筆實(shí)現(xiàn)類
public class BigMaobi extends Maobi{
@Override
public void paint() {
//著色
System.out.println("這個(gè)是大毛筆!");
color.color();
}
}
public class SmallMaobi extends Maobi{
@Override
public void paint() {
System.out.println("這個(gè)是小毛筆");
color.color();
}
}
抽象部分,顏色的接口
public abstract class MyColor {
public abstract void color();
}
顏色接口的 具體實(shí)現(xiàn)
public class RedColor extends MyColor{
@Override
public void color() {
System.out.println("紅色");
}
}
public class GreenColor extends MyColor{
@Override
public void color() {
System.out.println("這個(gè)是綠色");
}
}
最后構(gòu)建客戶端運(yùn)行下
public class Client {
public static void main(String[] args) {
Maobi mb=new BigMaobi();
MyColor color=new RedColor();
mb.setColor(color);
mb.paint();
}
}
可以得出,需要改造筆的不同型號(hào),繼承 Maobi 類就可以,和顏色無(wú)關(guān),顏色需要新增的話,就實(shí)現(xiàn) MyColor,也與毛筆類型無(wú)關(guān),這樣在各自的維度自由飛翔。