Java設計模式之橋梁(Bridge)模式
橋梁模式的結構
橋梁模式是對象的結構模式。

如上圖所示,系統(tǒng)含有兩個等級結構:
- 由抽象化角色和修正抽象化角色組成的抽象化等級結構。
- 由實現(xiàn)化角色和兩個具體實現(xiàn)化角色所組成的實現(xiàn)化等級結構。
橋梁模式所涉及的角色有:
- 抽象化(Abstraction)角色:抽象化給出的定義,并保存一個對實現(xiàn)化對象的引用。
- 修正抽象(Refined Abstraction)化角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
- 實現(xiàn)化(Implementor)角色:這個角色給出實現(xiàn)化角色的接口,但不給出具體的實現(xiàn)。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。 實現(xiàn)化角色應當只給出底層操作,而抽象化角色應當只給出基于底層操作的更高一層的操作。
- 具體實現(xiàn)化(Concrete Implementor)角色:這個角色給出實現(xiàn)化角色接口的具體實現(xiàn)。
對象是對行為的封裝,而行為是由方法實現(xiàn)的。在這個示意性系統(tǒng)里,抽象化等級結構中的類封裝了operation()方法;而實現(xiàn)化等級結構中的類封裝的是operationImp()方法。
抽象化等級結構中的商業(yè)方法通過向?qū)膶崿F(xiàn)化對象的委派實現(xiàn)自己的功能,這意味著抽象化角色可以通過向不同的實例化對象委派,來達到動態(tài)地轉(zhuǎn)換自己的功能的目的。
示意性源碼:
抽象化角色,商業(yè)方法operation()的實現(xiàn)是通過向?qū)崿F(xiàn)化對象的委派(調(diào)用operationImp()方法)實現(xiàn)的。
abstract public class Abstraction {
protected Implementor imp;
/**
* 某個商業(yè)方法
*/
public void operation() {
imp.operationImp();
}
}
修正抽象化角色,商業(yè)方法被置換掉了。
public class RefinedAbstraction extends Abstraction {
/**
* 某個商業(yè)方法在修正抽象化角色的實現(xiàn)
*/
public void operation() {
// improved logic
}
}
實現(xiàn)化角色抽象類Implementor中聲明一個抽象方法operationImp(),這個方法必須由具體子類實現(xiàn)。
abstract public class Implementor {
/**
* 某個商業(yè)方法的實現(xiàn)化聲明
*/
public abstract void operationImp();
}
具體實現(xiàn)化角色實現(xiàn)了抽象類Implementor所聲明的商業(yè)方法operationImp()。
public class ConcreteImplementorA extends Implementor {
/**
* 某個商業(yè)方法的實現(xiàn)化實現(xiàn)
*/
public void operationImp() {
System.out.println("Do something...");
}
}
一般而言,實現(xiàn)化角色中的每一個方法都應當有一個抽象化角色中的某一個方法與之相對應,但是,反過來則不一定。換言之,抽象化角色的接口比實現(xiàn)化角色的接口寬。抽象化角色除了提供與實現(xiàn)化角色相關的方法之外,還有可能提供其他的商業(yè)方法;而實現(xiàn)化角色則往往僅為實現(xiàn)抽象化角色的相關行為而存在。
例子
空中巴士(Airbus)、波音(Boeing)和麥道(McDonnell-Douglas)都是飛機制造商,它們都生產(chǎn)載客飛機(Passenger Plane)和載貨飛機(Cargo Plane)。現(xiàn)在需要設計一個系統(tǒng),描述這些飛機制造商以及它們所制造的飛機種類。
設計方案一

在這個設計方案里,有兩個子接口:客機和貨機。所有的具體飛機又都要繼承自Airbus,Boeing和MD等超類。這樣一來,每一個具體飛機都帶有兩個超類型:飛機制造商類型,客、貨機類型。
這樣設計造成具體飛機與飛機制造商、飛機種類之間的耦合過強,無法滿足“開-閉原則”:
- 需要向系統(tǒng)引進新的飛機制造商;
- 需要向系統(tǒng)引進新的飛機類型。
設計方案二
橋梁模式,抽象化角色——飛機的種類,實現(xiàn)化角色——飛機制造商。

客機和貨機經(jīng)過一個飛機的“轉(zhuǎn)世”橋梁,可以分別“投胎”到空中巴士、波音和麥道等飛機制造商哪里,“出生”為不同牌子的飛機。
由于這個“轉(zhuǎn)世”橋梁實際上是一個聚合關系,因此可以動態(tài)地變化。所以如果系統(tǒng)需要加入新的飛機種類或者飛機制造商的話,已有的各個角色不必改變,需要改變的僅僅是一個多態(tài)性的聚合關系。
示意性源代碼:
抽象化角色類Airplane。
abstract public class Airplane {
protected AirplaneMaker airplaneMaker;
abstract public void fly();
protected Airplane(AirplaneMaker airplaneMaker) {
this.airplaneMaker = airplaneMaker;
}
}
載客飛機和載貨飛機屬于修正抽象化角色。
public class PassengerPlane extends Airplane {
public void fly() {
// Write your code here
airplaneMaker.produce();
}
public PassengerPlane(AirplaneMaker airplaneMaker) {
super(airplaneMaker);
}
}
public class CargoPlane extends Airplane {
public void fly() {
// Write your code here
airplaneMaker.produce();
}
public CargoPlane(AirplaneMaker airplaneMaker) {
super(airplaneMaker);
}
}
實現(xiàn)化角色是飛機制造商AirplaneMaker,給出修正抽象化角色所需要實現(xiàn)的接口。
abstract public class AirplaneMaker {
abstract public void produce();
}
具體實現(xiàn)化角色是Airbus、Boeing、MD。
public class Airbus extends AirplaneMaker {
public void produce() {
// Write your code here
System.out.println("produce by Airbus");
}
}
public class Boeing extends AirplaneMaker {
public void produce() {
// Write your code here
System.out.println("produce by Boeing");
}
}
public class MD extends AirplaneMaker {
public void produce() {
// Write your code here
System.out.println("produce by MD");
}
}
客戶端代碼。
public class BridgePatternDemo {
public static void main(String[] args) {
Airplane mdPassengerPlane = new PassengerPlane(new MD());
Airplane mdCargoPlane = new CargoPlane(new MD());
mdPassengerPlane.fly();
mdCargoPlane.fly();
Airplane boeingPassengerPlane = new PassengerPlane(new Boeing());
Airplane boeingCargoPlane = new CargoPlane(new Boeing());
boeingPassengerPlane.fly();
boeingCargoPlane.fly();
}
}
現(xiàn)在,如果需要增加新的飛機制造商或者新的飛機種類,只需要向系統(tǒng)引進一個新的修正抽象化角色或者一個新的具體實現(xiàn)化角色即可。即系統(tǒng)的功能可以在不修改已有代碼的情況下得到擴展,符合“開-閉”原則。
到此這篇關于Java設計模式之橋梁(Bridge)模式的文章就介紹到這了,更多相關Java 橋梁模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析
這篇文章主要介紹了java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析,使用關鍵字volatile和使用鎖(如synchronized關鍵字或者java.util.concurrent包中的鎖)來確保對共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下2023-08-08
Spring Boot使用Servlet及Filter過程詳解
這篇文章主要介紹了Spring Boot使用Servlet及Filter過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
SpringBoot請求處理之常用參數(shù)注解介紹與源碼分析
SpringBoot是一種整合Spring技術棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學習請求處理、常用注解和方法參數(shù)的小技巧2022-10-10
Java中l(wèi)ogback?自動刷新不生效的問題解決
本文主要介紹了Java中l(wèi)ogback?自動刷新不生效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
Java利用自定義注解、反射實現(xiàn)簡單BaseDao實例
下面小編就為大家?guī)硪黄狫ava利用自定義注解、反射實現(xiàn)簡單BaseDao實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

