橋接模式
橋接模式的概念
橋接模式(Bridge Pattern)也被稱為橋梁模式,或者接口模式(Interface Pattern)。主要實作的功能是用于把抽象化和實作化接偶,使得二者可以獨立變化,通常的講
講抽象部分與他的具體實作部分分離,使得他們可以獨立地變化
。橋接模式在類的建立過程中屬于結構型模式。
橋接模式主要是目的就是通過組合的方式建立兩個類之間的聯系,而不是繼承。但又類似多重繼承方案,但是多重繼承方案違背了設計模式的七大原則之一的單一職責原則,是以橋接模式是多重繼承方案的更新版,主要核心在于接偶抽象和實作。
同時橋接模式基于類的最小設計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責。
橋接模式的應該場景
橋接模式有很多應用場景,通常情況下都用來建立兩個類之間的關系,官方的原話是
- 如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜态的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
- 對于那些不希望使用繼承或因為多層次繼承導緻系統類的個數急劇增加的系統,橋接模式尤為适用。
- 當一個類存在兩個獨立變化的次元,且這兩個次元都需要進行擴充時
這樣三點通常比較難了解,那麼下面通過代碼示例和UML結構圖分析來全面的了解橋接模式的應用場景。
橋接模式的通用寫法
- 抽象化(Abstraction)角色:該角色持有一個對實作角色的引用,抽象角色的方法需要在實作角色中實作,抽象化角色一般為抽象類。
- 修正抽象化(RefinedAbstraction)角色:抽象化角色的具體實作,對抽象化角色的方法和功能進行擴充和增強,改變和修正父類對抽象化的定義。
- 實作化(Implementor)角色:這個角色給出實作化角色的接口,但不給出具體的實作。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。實作化角色應當隻給出底層操作,而抽象化角色應當隻給出基于底層操作的更高一層的操作。
- 具體實作化(ConcreteImplementor)角色:這個角色給出實作化角色接口的具體實作。
- Abstraction(抽象化角色)
public abstract class Abstraction {
protected IImplementor mImplementor;
public Abstraction(IImplementor implementor) {
this.mImplementor = implementor;
}
public void operation() {
this.mImplementor.operationImpl();
}
}
- RefinedAbstraction(修正抽象化角色)
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(IImplementor implementor) {
super(implementor);
}
@Override
public void operation() {
super.operation();
System.out.println("refined operation");
}
}
- IImplementor(實作化角色)
public interface IImplementor {
void operationImpl();
}
- ConcreteImplementor(具體實作化角色)
public class ConcreteImplementor implements IImplementor {
@Override
public void operationImpl() {
System.out.println("I'm ConcreteImplementor A");
}
}
- UML結構圖
橋接模式的優缺點
優點
- 分離抽象部分和實作部分,達到結耦層次
- 可以通過組合的形式增加了系統的擴充性
- 符合開閉原則
- 符合合成服用原則
缺點
- 增加了系統的了解和設計難度,使得代碼閱讀和編寫難度增大
- 需要正确的識别兩個次元的相關知識,否則不易使用。