橋接模式學習筆記
橋接模式是一種很實用的結構型設計模式,如果軟件系統中某個類存在兩個獨立變化的維度,通過該模式可以將這兩個維度分離出來,使得兩者可以獨立擴展。
橋接模式用一種巧妙的方式處理多層繼承存在的問題,用抽象關聯取代了傳統的多層繼承,將類之間的靜態繼承關係轉換爲動態的對象組合關係。
定義:橋接模式將抽象部分和實現部分分離,使得它們都可以獨立地變化。它是一種對象結構型模式。
下圖是橋接模式的結構圖:
從上圖中可以發現包含如下幾個角色:
Abstraction抽象類接口:通常是抽象類而不是接口,包含業務方法,並且持有一個Implementor的對象。
RefineAbstraction擴充抽象類:實現在Abstraction抽象類中聲明的業務方法,同時還可以調用Implementor中的方法。
Implementor實現類接口:不一定要和Abstraction類中的接口一致,通常Implementor中只是提供基本操作,而在Abstraction中才提供複雜操作。
ConcreteImplementor具體實現類:實現Implementor中的接口。
實現代碼:
interface Implementor {
public void operationImpl();
}
abstract class Abstraction {
protected Implementor impl;
public void setImpl(Implementor impl) {
this.impl = impl;
}
public abstract void operation();
}
class RefinedAbstraction extends Abstraction {
public void operation() {
impl.operationImpl();
}
}
那麼在客戶端:
class Client {
public static void main(String args[]) {
Implementor impl = new ConcreteImplememtor();
Abstraction ab = new RefinedAbstraction();
ab.setImpl(impl);
ab.operation();
}
}
客戶端編程時都是和抽象類打交道,諸如Abstraction類和Implementor類,而在執行期間纔會真正的調用具體類的方法,並且在Abstraction類中是持有Implememtor的對象的,因此可以調用實現部分的業務方法的。
總結:
橋接模式分離抽象接口及其實現部分,使用對象之間的關聯關係來解耦抽象及實現的關係。橋接模式可以取代多層繼承的方案,在兩個變化維度中任意擴展一個維度都不需要修改原有系統。
如果一個系統需要在抽象化和具體化之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承關係,通過橋接模式可以使它們在抽象層建立一個聯繫。
可以對抽象部分和實現部分獨立擴展而互不影響。對於那些不希望使用繼承或者因爲多層繼承導致系統類的個數急劇增加的系統,橋接模式尤爲適用。