設(shè)計(jì)模式-橋梁模式

橋梁模式是為了解決將抽象部分與實(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),這樣在各自的維度自由飛翔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 定義 橋梁模式是對(duì)象的結(jié)構(gòu)模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。...
    步積閱讀 6,902評(píng)論 0 10
  • 這里是對(duì)《設(shè)計(jì)模式Java版》[https://gof.quanke.name]的提煉匯總,在真正深入理解之前,方...
    LeonXtp閱讀 1,154評(píng)論 0 0
  • 1.初識(shí)橋接模式 將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。 Abstraction:抽象部分的接口。...
    王偵閱讀 1,011評(píng)論 0 7
  • 一、應(yīng)用場(chǎng)景 設(shè)想如果要繪制矩形、圓形、橢圓、正方形,我們至少需要4個(gè)形狀類,但是如果繪制的圖形需要具有不同的顏色...
    QuantRuu閱讀 826評(píng)論 0 51
  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★☆☆】直接出處:橋接模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 1,050評(píng)論 0 2

友情鏈接更多精彩內(nèi)容