橋接模式是一種很實用的結構型設計模式,如果軟件系統中某個類存在兩個獨立變化的維度,通過該模式可以將這兩個維度分離出來,使兩者可以獨立擴展,讓系統更加符合“單一職責原則”。與多層繼承方案不同,它將兩個獨立變化的維度設計爲兩個獨立的繼承等級結構,並且在抽象層建立一個抽象關聯,該關聯關係類似一條連接兩個獨立繼承結構的橋,故名橋接模式。
橋接模式用一種巧妙的方式處理多層繼承存在的問題,用抽象關聯取代了傳統的多層繼承,將類之間的靜態繼承關係轉換爲動態的對象組合關係,使得系統更加靈活,並易於擴展,同時有效控制了系統中類的個數。
Bridge接口:
package com.Geeksun.bridge;
public interface Bridge {
void destination();
}
Bridge實現類
package com.Geeksun.bridge;
public class BridgeA implements Bridge {
@Override
public void destination() {
System.out.println("to A place");
}
}
package com.Geeksun.bridge;
public class BridgeB implements Bridge {
@Override
public void destination() {
System.out.println("to B place");
}
}
package com.Geeksun.bridge;
public class BridgeC implements Bridge {
@Override
public void destination() {
System.out.println("to C place");
}
}
Area(出發地)抽象類及子類
package com.Geeksun.bridge;
public abstract class Area {
protected Bridge bridge;
abstract void fromArea();
}
class Area1 extends Area{
public Area1(Bridge bridge){
this.bridge = bridge;
}
@Override
void fromArea() {
System.out.println("from 1");
bridge.destination();
}
}
class Area2 extends Area{
public Area2(Bridge bridge){
this.bridge = bridge;
}
@Override
void fromArea() {
System.out.println("from 2");
bridge.destination();
}
}
class Area3 extends Area{
public Area3(Bridge bridge){
this.bridge = bridge;
}
@Override
void fromArea() {
System.out.println("from 3");
bridge.destination();
}
}
Client
package com.Geeksun.bridge;
public class Client {
public static void main(String[] args) {
Area area = new Area1(new BridgeB());
area.fromArea();
}
}
運行結果:
from 1 to B place
如何,只要你認真看完了實例,你就明白了這種模式的好處,現在我們要添加來源地和目的地,只要繼續繼承AreaA和實現Qiao即可,之前我所說的綁定,正式此處將橋與目的地綁定在一起,使用一個接口完成。
其實要完成橋接模式,注意點並不多,重在理解模式的使用場景。
注意點:
1、定義一個橋接口,使其與一方綁定,這一方的擴展全部使用實現橋接口的方式。
2、定義一個抽象類,來表示另一方,在這個抽象類內部要引入橋接口,而這一方的擴展全部使用繼承該抽象類的方式。
其實我們可以發現橋接模式應對的場景有方向性的,橋綁定的一方都是被調用者,屬於被動方,抽象方屬於主動方。
其實我的JDK提供的JDBC數據庫訪問接口API正是經典的橋接模式的實現者,接口內部可以通過實現接口來擴展針對不同數據庫的具體實現來進行擴展,而對外的僅僅只是一個統一的接口調用,調用方過於抽象,可以將其看做每一個JDBC調用程序(這是真實實物,當然不存在抽象)
下面來理解一下開頭的概念:
橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。
這種模式涉及到一個作爲橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。
理解:此處抽象化與實現化分別指代實例中的雙方,而且實現化對應目的地方(通過實現橋接口進行擴展),抽象方對應來源地方(通過繼承抽象類來進行擴展),如果我們不使用橋接模式,我們會怎麼想實現這個實例呢?很簡單,我們分別定義來源地A1、A2、A3類和目的地B1、B2、B3,然後具體的實現就是,A1到B1一個類,A1到B2一個類,等,如果我們要擴展了A和B ,要直接增加An類和Bn類,如此編寫不說類內部重複性代碼多,而且還會導致類結構的急劇膨脹,最重要的是,在通過繼承實現路徑的時候,會造成雙方耦合性增大,而這又進一步加劇了擴展的複雜性。使用橋結構模式可以很好地規避這些問題:重在解耦。