詳解Java設(shè)計(jì)模式之橋接模式
1 橋接模式的定義
橋接模式(Bridge Pattem):將抽象部分和實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。它是一種對象結(jié)構(gòu)型模式,又稱柄體模式或者接口模式。
2 為什么引入橋接模式

當(dāng)用戶采用多繼承的方式實(shí)現(xiàn)代碼時,增加一個新的種類非常不方便(可拓展性差)。如上圖,我想增加一個奧迪類,則需要在跑車中增加奧迪跑車類,在SUV中增加奧迪SUV類,這僅僅是兩個,如果是多的話會更加的麻煩。
同時也違反了 單一職責(zé)原則。
橋接模式可以很好的優(yōu)化這一問題。
3 橋接實(shí)戰(zhàn)
把上面的例子總結(jié)一下,可以得到如下的圖。

橋接模式的作用就如同中間的點(diǎn),將類型和品牌聯(lián)系起來。

3.1 代碼
Brand.interface
//品牌接口
public interface Brand {
public void info();
}BMW
public class BMW implements Brand{
@Override
public void info() {
System.out.print("寶馬");
}
}Benz
public class Benz implements Brand{
@Override
public void info() {
System.out.print("奔馳");
}
}Car
public abstract class Car {
protected Brand brand;
public Car(Brand brand) {
this.brand = brand;
}
public void info()
{
brand.info();
}
}SportsCar
public class SportsCar extends Car{
public SportsCar(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.println("跑車");
}
}SUV
public class SUV extends Car{
public SUV(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.println("越野車");
}
}Client
public class Client {
public static void main(String[] args) {
//寶馬跑車
Car car = new SportsCar(new BMW());
car.info();
}
}3.2 類圖

將多繼承轉(zhuǎn)化為橋接模式之后,如果在想增加一個凱利拉克,就只需要在Car里面增加一個凱利拉克,而不需要對其他類進(jìn)行改動。
4 橋接模式的優(yōu)缺點(diǎn)
4.1 優(yōu)點(diǎn)
- 橋接模式偶爾類似于多繼承方案,但是多繼承方案違背了類的單一職責(zé)原則,復(fù)用性比較差,類的個數(shù)也非常多,橋接模式是比多繼承方案更好的解決方法。極大的減少了子類的個數(shù),從而降低管理和維護(hù)的成本。
- 橋接模式提高了系統(tǒng)的可擴(kuò)充性,在兩個變化維度中任意拓展一個維度,都不需要修改原有的系統(tǒng)。符合開閉原則,就像一座橋,可以把兩個變化的維度連接起來。
4.2 缺點(diǎn)
- 橋接模式的引入會增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)與編程。
- 橋接模式要求正確識別出系統(tǒng)中兩個獨(dú)立變化的維度,因此其使用范圍具有一定的局限性。
4.3 適用環(huán)境
如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們在抽象層建立一個關(guān)聯(lián)關(guān)系。
抽象化角色和實(shí)現(xiàn)化角色可以繼承的方式獨(dú)立擴(kuò)展而不相互影響,在程序運(yùn)行時可以動態(tài)講一個抽象化子類的對象和一個實(shí)現(xiàn)化子類的對象進(jìn)行組合,即系統(tǒng)需要對抽象化角色和實(shí)現(xiàn)化角色進(jìn)行動態(tài)耦合。
一個類存在兩個獨(dú)立變化的維度,且這兩個維度都需要進(jìn)行擴(kuò)展。雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)需求需要獨(dú)立管理這兩者。
對于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
4.4 場景
- Java語言通過Java虛擬機(jī)實(shí)現(xiàn)跨平臺性
- AWT中的Peer架構(gòu)
然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)需求需要獨(dú)立管理這兩者。
對于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
- Java語言通過Java虛擬機(jī)實(shí)現(xiàn)跨平臺性
- AWT中的Peer架構(gòu)
- JDBC驅(qū)動程序也是橋接模式的應(yīng)用之一
到此這篇關(guān)于詳解Java設(shè)計(jì)模式之橋接模式的文章就介紹到這了,更多相關(guān)Java橋接模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud?hystrix斷路器與全局解耦全面介紹
什么是服務(wù)降級?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對一些服務(wù)和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作2022-10-10
JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼詳解
Feign是一個聲明式的Web Service客戶端,是一種聲明式、模板化的HTTP客戶端。而OpenFeign是Spring Cloud 在Feign的基礎(chǔ)上支持了Spring MVC的注解,如@RequesMapping等等,這篇文章主要給大家介紹了關(guān)于JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼的相關(guān)資料,需要的朋友可以參考下2021-10-10
如何利用Retrofit+RxJava實(shí)現(xiàn)網(wǎng)絡(luò)請求的異常處理
這篇文章主要介紹了如何利用Retrofit+RxJava實(shí)現(xiàn)網(wǎng)絡(luò)請求的異常處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Mybatis之foreach標(biāo)簽內(nèi)傳入list為空的問題
這篇文章主要介紹了Mybatis之foreach標(biāo)簽內(nèi)傳入list為空的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程
網(wǎng)上關(guān)于寶塔運(yùn)行springBoot的東西說有點(diǎn)迷糊,但是有一句話很重要,Spring boot項(xiàng)目只需要JDK環(huán)境即可部署成功,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程,需要的朋友可以參考下2023-05-05
SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn)
本文主要介紹了SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式
這篇文章主要介紹了springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
詳解IDEA多module項(xiàng)目maven依賴的一些說明
這篇文章主要介紹了詳解IDEA多module項(xiàng)目maven依賴的一些說明,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Java CGLib動態(tài)代理機(jī)制(全面解析)
下面小編就為大家?guī)硪黄狫ava CGLib動態(tài)代理機(jī)制(全面解析)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

