【設計模式學習筆記】橋樑模式
阿新 • • 發佈:2019-01-08
文章目錄
橋樑模式提供了一種弱類間關係,關聯關係。在設計模式之禪的案例中,子類必須實現抽象父類中的所有方法,父類抽象方法的變更,必然導致子類的變更。這是一種強關聯關係。強關聯有必然使我們的系統不易擴充套件。所以橋樑模式為化解強關聯提供了一種解決方案。
大致的思路應該是這樣。首先將程式中容易變更,或者以後需要擴充套件的部分提取出來,將擴充套件方法抽象,並封裝到一個抽象類中。這個抽象類自然要關聯到原來的類中。這樣程式從繼承會降低到關聯(程式中具體是組合關係)關係。
本來我們有一個生產車間,想要讓他生產別的產品自然要在車間中加入其它的生產流水線。程式就會變成這樣:
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