橋接模式(Bridge)是一種結構型設計模式。Bridge模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責。它的主要特點是把抽象(Abstraction)與行為實現(Implementation)分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴展。
橋接模式的角色和職責:
1.Client 調用端
這是Bridge模式的調用者。
2.抽象類(Abstraction)
抽象類接口(接口這貨抽象類)維護隊行為實現(implementation)的引用。它的角色就是橋接類。
3.Refined Abstraction
這是Abstraction的子類。
4.Implementor
行為實現類接口(Abstraction接口定義了基於Implementor接口的更高層次的操作)
5.ConcreteImplementor
Implementor的子類
橋接模式的UML圖如下:
示例代碼如下:
首先定義Implementor接口,其中定義了其實現類必須要實現的接口operation()
1 public interface Implementor { 2 public void operation(); 3 }
下面定義Implementor接口的兩個實現類:
1 public class ConcreateImplementorA implements Implementor { 2 @Override 3 public void operation() { 4 System.out.println("this is concreteImplementorA's operation..."); 5 } 6 }
1 public class ConcreateImplementorB implements Implementor { 2 @Override 3 public void operation() { 4 System.out.println("this is concreteImplementorB's operation..."); 5 } 6 }
下面定義橋接類Abstraction,其中有對Implementor接口的引用:
1 public abstract class Abstraction { 2 private Implementor implementor; 3 4 public Implementor getImplementor() { 5 return implementor; 6 } 7 8 public void setImplementor(Implementor implementor) { 9 this.implementor = implementor; 10 } 11 12 protected void operation(){ 13 implementor.operation(); 14 } 15 }
下面是Abstraction類的子類RefinedAbstraction:
1 public class RefinedAbstraction extends Abstraction { 2 @Override 3 protected void operation() { 4 super.getImplementor().operation(); 5 } 6 }
下面給出測試類:
1 public class BridgeTest { 2 public static void main(String[] args) { 3 Abstraction abstraction = new RefinedAbstraction(); 4 5 //調用第一個實現類 6 abstraction.setImplementor(new ConcreateImplementorA()); 7 abstraction.operation(); 8 9 //調用第二個實現類 10 abstraction.setImplementor(new ConcreateImplementorB()); 11 abstraction.operation(); 12 13 } 14 }
運行結果如下:
這樣,通過對Abstraction橋接類的調用,實現了對接口Implementor的實現類ConcreteImplementorA和ConcreteImplementorB的調用。實現了抽象與行為實現的分離。
總結:
1.橋接模式的優點
(1)實現了抽象和實現部分的分離
橋接模式分離了抽象部分和實現部分,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,分別定義接口,這有助於系統進行分層設計,從而產生更好的結構化系統。對於系統的高層部分,只需要知道抽象部分和實現部分的接口就可以了。
(2)更好的可擴展性
由於橋接模式把抽象部分和實現部分分離了,從而分別定義接口,這就使得抽象部分和實現部分可以分別獨立擴展,而不會相互影響,大大的提供了系統的可擴展性。
(3)可動態的切換實現
由於橋接模式實現了抽象和實現的分離,所以在實現橋接模式時,就可以實現動態的選擇和使用具體的實現。
(4)實現細節對客戶端透明,可以對用戶隱藏實現細節。
2.橋接模式的缺點
(1)橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計和編程。
(2)橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用范圍有一定的局限性。
3.橋接模式的使用場景
(1)如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
(2)抽象化角色和實現化角色可以以繼承的方式獨立擴展而互不影響,在程序運行時可以動態將一個抽象化子類的對象和一個實現化子類的對象進行組合,即系統需要對抽象化角色和實現化角色進行動態耦合。
(3)一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
(4)雖然在系統中使用繼承是沒有問題的,但是由於抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
(5)對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用