1. 程式人生 > >【設計模式學習筆記】橋樑模式

【設計模式學習筆記】橋樑模式

文章目錄

         1.1 我們的廠房長這樣

         1.2 CarA長這樣

         1.3 CarA下擴充套件個產品吧,這個很easy

         1.4 實實在在的車房

         1.5 測試

         1.6 結果

         

1.7 uml

         參考

橋樑模式提供了一種弱類間關係,關聯關係。在設計模式之禪的案例中,子類必須實現抽象父類中的所有方法,父類抽象方法的變更,必然導致子類的變更。這是一種強關聯關係。強關聯有必然使我們的系統不易擴充套件。所以橋樑模式為化解強關聯提供了一種解決方案。

大致的思路應該是這樣。首先將程式中容易變更,或者以後需要擴充套件的部分提取出來,將擴充套件方法抽象,並封裝到一個抽象類中。這個抽象類自然要關聯到原來的類中。這樣程式從繼承會降低到關聯(程式中具體是組合關係)關係。

本來我們有一個生產車間,想要讓他生產別的產品自然要在車間中加入其它的生產流水線。程式就會變成這樣:

abstract class Company {
  public abstract void productA();
}

 這樣的話,我們要是經營不錯,擴充套件B、C、D、E、F、G、H…產品咋辦,子類方法是不是都得跟著翻倍?繼承幾次翻幾次。

那麼幹脆將生產的各樣產品交給一個抽象類去管理吧,廠房裡只留下這個抽象產品類。

1.1 我們的廠房長這樣 

package bright;

/************************************************
 *@ClassName : CarProductI
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/6 7:24】
 *@Version : 1.0.0
 *************************************************/

public abstract class CarCompanyA {
    // 這是橋樑模式的關鍵
    private CarA carA;

    public void makeMoney(){
        this.carA.productCar();
        this.carA.sellCar();
    }

    public CarCompanyA(CarA carI) {
        this.carA = carI;
    }
}

 這個CarA就是我們抽象的產品類。

1.2 CarA長這樣

package bright;

/************************************************
 *@ClassName : OtherCarI
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/6 21:36】
 *@Version : 1.0.0
 *************************************************/

public abstract class CarA {
    abstract void productCar();
    abstract void sellCar();
}

1.3 CarA下擴充套件個產品吧,這個很easy

package bright;

/************************************************
 *@ClassName : BWMCar
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/6 21:42】
 *@Version : 1.0.0
 *************************************************/

public class BWMCar extends CarA {
    @Override
    public void productCar() {
        System.out.println("生產寶馬車");
    }

    @Override
    public void sellCar() {
        System.out.println("銷售寶馬車,真香");
    }
}

這時候就差不多了,但是我們的車房還是抽象的,繼承她唄,抽象只是幻想啊~要腳踏實地。。。

1.4 實實在在的車房

package bright;

/************************************************
 *@ClassName : CopyCompany
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/6 22:13】
 *@Version : 1.0.0
 *************************************************/

public class CopyCompany extends CarCompanyA {

    public CopyCompany(CarA car) {
        super(car);
    }

    @Override
    public void makeMoney() {
        super.makeMoney();
        System.out.println("山寨車賺錢!");
    }
}

1.5 測試

好了,車房產品都有了。生產吧!細心的你或許會發現我們的車房可以擴充套件,產品也可以擴充套件,互不影響!!!!(當然了只是從程式上將,你讓服裝廠生產小轎車,在code的世界裡,誰都阻止不了你。或許審查程式碼的BOSS會打死你~)

package bright;

/************************************************
 *@ClassName : Test
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/6 22:04】
 *@Version : 1.0.0
 *************************************************/

public class Test {
    public static void main(String[] args) {
        CopyCompany carCompanyCopy = new CopyCompany(new BWMCar());
        carCompanyCopy.makeMoney();
    }
}

1.6 結果

1.7 uml 

 

參考

【菜鳥教程】http://www.runoob.com/design-pattern/bridge-pattern.html

 本文原文地址:https://blog.csdn.net/baidu_30325009/article/details/84898882