詳解Java設(shè)計模式之橋接模式
1 橋接模式的定義
橋接模式(Bridge Pattem):將抽象部分和實現(xiàn)部分分離,使它們都可以獨立地變化。它是一種對象結(jié)構(gòu)型模式,又稱柄體模式或者接口模式。
2 為什么引入橋接模式
當(dāng)用戶采用多繼承的方式實現(xiàn)代碼時,增加一個新的種類非常不方便(可拓展性差)。如上圖,我想增加一個奧迪類,則需要在跑車中增加奧迪跑車類,在SUV中增加奧迪SUV類,這僅僅是兩個,如果是多的話會更加的麻煩。
同時也違反了 單一職責(zé)原則。
橋接模式可以很好的優(yōu)化這一問題。
3 橋接實戰(zhàn)
把上面的例子總結(jié)一下,可以得到如下的圖。
橋接模式的作用就如同中間的點,將類型和品牌聯(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里面增加一個凱利拉克,而不需要對其他類進行改動。
4 橋接模式的優(yōu)缺點
4.1 優(yōu)點
- 橋接模式偶爾類似于多繼承方案,但是多繼承方案違背了類的單一職責(zé)原則,復(fù)用性比較差,類的個數(shù)也非常多,橋接模式是比多繼承方案更好的解決方法。極大的減少了子類的個數(shù),從而降低管理和維護的成本。
- 橋接模式提高了系統(tǒng)的可擴充性,在兩個變化維度中任意拓展一個維度,都不需要修改原有的系統(tǒng)。符合開閉原則,就像一座橋,可以把兩個變化的維度連接起來。
4.2 缺點
- 橋接模式的引入會增加系統(tǒng)的理解與設(shè)計難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進行設(shè)計與編程。
- 橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度,因此其使用范圍具有一定的局限性。
4.3 適用環(huán)境
如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們在抽象層建立一個關(guān)聯(lián)關(guān)系。
抽象化角色和實現(xiàn)化角色可以繼承的方式獨立擴展而不相互影響,在程序運行時可以動態(tài)講一個抽象化子類的對象和一個實現(xiàn)化子類的對象進行組合,即系統(tǒng)需要對抽象化角色和實現(xiàn)化角色進行動態(tài)耦合。
一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設(shè)計需求需要獨立管理這兩者。
對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
4.4 場景
- Java語言通過Java虛擬機實現(xiàn)跨平臺性
- AWT中的Peer架構(gòu)
然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設(shè)計需求需要獨立管理這兩者。
對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
- Java語言通過Java虛擬機實現(xiàn)跨平臺性
- AWT中的Peer架構(gòu)
- JDBC驅(qū)動程序也是橋接模式的應(yīng)用之一
到此這篇關(guān)于詳解Java設(shè)計模式之橋接模式的文章就介紹到這了,更多相關(guān)Java橋接模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringValidation自定義注解及分組校驗功能詳解
這篇文章主要介紹了SpringValidation自定義注解及分組校驗功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01Java面向?qū)ο蠡A(chǔ)知識之封裝,繼承,多態(tài)和抽象
這篇文章主要介紹了Java面向?qū)ο蟮姆庋b,繼承,多態(tài)和抽象,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11JAVA對象JSON數(shù)據(jù)互相轉(zhuǎn)換的四種常見情況
這篇文章主要介紹了JAVA對象JSON數(shù)據(jù)互相轉(zhuǎn)換的四種常見情況,需要的朋友可以參考下2014-04-04