您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java橋接模式怎么使用”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“Java橋接模式怎么使用”文章能幫助大家解決問題。
其實在現(xiàn)實生活中,有很多類可以有兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分,如果用繼承方式,m 種形狀和 n 種顏色的圖形就有 m*n 種,不但對應(yīng)的子類很多,而且擴(kuò)展比較困難。
比如不同顏色和字體的文字、不同品牌和功率的汽車、不同性別和職業(yè)的男女、支持不同平臺和不同文件格式的媒體播放器等。如果用橋接模式就能很好地解決這些問題。
將抽象與實現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn),從而降低了抽象和實現(xiàn)這兩個可變維度的耦合度
模式類型:結(jié)構(gòu)設(shè)計模式
原理類圖:
原理類圖說明:
Client類: 橋接模式的調(diào)用者
抽象類(Abstraction) : 維護(hù)了Implementor/即它的實現(xiàn)類ConcretelmplementorA…二者是器合關(guān)系,Abstraction充當(dāng)橋接英
RehinedAbstraction: 是Abstraction抽象類的子類lmplementor:行為實現(xiàn)類的接口
ConcretelmplementorA/B: 行為的具體實現(xiàn)類
從UML圖: 這里的抽象類和接口是聚合的關(guān)系,其實調(diào)用和被調(diào)用關(guān)系
優(yōu)點(diǎn):
抽象與實現(xiàn)分離,擴(kuò)展能力強(qiáng)
符合開閉原則
符合合成復(fù)用原則
其實現(xiàn)細(xì)節(jié)對客戶透明
缺點(diǎn):
由于聚合關(guān)系建立在抽象層,要求開發(fā)者針對抽象化進(jìn)行設(shè)計與編程,能正確地識別出系統(tǒng)中兩個獨(dú)立變化的維度,這增加了系統(tǒng)的理解與設(shè)計難度
橋接(Bridge)模式包含以下主要角色:
抽象化(Abstraction)角色: 定義抽象類,并包含一個對實現(xiàn)化對象的引用
擴(kuò)展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實現(xiàn)父類中的業(yè)務(wù)方法,并通過組合關(guān)系調(diào)用實現(xiàn)化角色中的業(yè)務(wù)方法
實現(xiàn)化(Implementor)角色:定義實現(xiàn)化角色的接口,供擴(kuò)展抽象化角色調(diào)用
具體實現(xiàn)化(Concrete Implementor)角色:給出實現(xiàn)化角色接口的具體實現(xiàn)
結(jié)構(gòu)圖:
該結(jié)構(gòu)圖的實現(xiàn)代碼:
實視化角色:
/** * 實視化角色 */public interface Implemntor { public void OperationImpl();}
具體實現(xiàn)化角色:
/** * 具體實現(xiàn)化角色 */public class ConcreteImplementorA implements Implemntor{ @Override public void OperationImpl() { System.out.println("具體實現(xiàn)化角色被訪問"); }}
抽象化角色:
/** * 抽象化角色 */public abstract class Abstraction { protected Implemntor implemntor; protected Abstraction(Implemntor implemntor){ this.implemntor = implemntor; } public abstract void Operation();}
擴(kuò)展抽象化角色:
/** * 擴(kuò)展抽象化角色 */public class RefinedAbstraction extends Abstraction{ protected RefinedAbstraction(Implemntor implemntor) { super(implemntor); } public void Operation(){ System.out.println("擴(kuò)展抽象化角色被訪問"); implemntor.OperationImpl(); }}
測試類:
public class Test { public static void main(String[] args) { Implemntor implemntor = new ConcreteImplementorA(); Abstraction abs = new RefinedAbstraction(implemntor); abs.Operation(); }}
輸出:
擴(kuò)展抽象化角色被訪問 具體實現(xiàn)化角色被訪問
將實現(xiàn)與抽象放在兩個不同的類層次中,使兩個層次可以獨(dú)立改變
交通工具在路上行駛,這里有兩個維度的變化,交通工具的類型不同,路也分水泥路和柏油路
類圖:
交通工具類:
/** * 交通工具類 */public interface Vehicle { public void drive();}
具體的交通工具:小汽車
/** * 具體的交通工具:小汽車 */public class Car implements Vehicle{ @Override public void drive() { System.out.println("小汽車"); }}
具體的交通工具:大巴車
/** * 具體的交通工具:大巴車 */public class Bus implements Vehicle{ @Override public void drive() { System.out.println("大巴車"); }}
抽象的路:
/** * 抽象的路 */public abstract class Road { protected Vehicle vehicle; public Road(Vehicle vehicle){ this.vehicle = vehicle; } public abstract void driveOnRoad();}
具體的路:油柏路
/** * 具體的路:油柏路 */public class UnpavedRoad extends Road{ public UnpavedRoad(Vehicle vehicle) { super(vehicle); } @Override public void driveOnRoad() { super.vehicle.drive(); System.out.println("行駛在油柏路"); }}
具體的路:水泥路
/** * 具體的路:水泥路 */public class CementRoad extends Road{ public CementRoad(Vehicle vehicle) { super(vehicle); } @Override public void driveOnRoad() { super.vehicle.drive(); System.out.println("行駛在水泥路"); }}
測試類:
//測試public class Test { public static void main(String[] args) { Road roadCar = new CementRoad(new Car()); roadCar.driveOnRoad(); Road roadBus = new CementRoad(new Bus()); roadBus.driveOnRoad(); }}
輸出:
小汽車 行駛在水泥路 大巴車 行駛在水泥路
實現(xiàn)了抽象和實現(xiàn)部分的分離,從而極大的提供了系統(tǒng)的靈活性,讓抽象部分和實現(xiàn)部分獨(dú)立開來,這有助于系統(tǒng)進(jìn)行分層設(shè)計,從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)
對于系統(tǒng)的高層部分,只需要知道抽象部分和實現(xiàn)部分的接口就可以了,其它的部分由具體業(yè)務(wù)來完成
橋接模式替代多層繼承方案,可以減少子類的個數(shù),降低系統(tǒng)的管理和維護(hù)成本
橋接模式的引入增加了系統(tǒng)的理解和設(shè)計難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計和編程
橋接模式要求正確識別出系統(tǒng)中兩個獨(dú)立變化的維度,因此其使用范圍有一定的局限性,即需要有這樣的應(yīng)用場景
對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用.
關(guān)于“Java橋接模式怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。