重點內容
定義
將抽象部分與實現部分分離,使它們都可以獨立地進行變化
使用場景
如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承關係,可以通過橋接模式使他們在抽象層建立一個關聯關係
對於那些不希望使用繼承或因爲多層次繼承導致系統類的個數急劇增加的系統,也可以考慮使用橋接模式。
一個類存在兩個獨立變化的維度,且這兩個 維度都需要進行擴展。
關鍵點
一個抽象部分角色—一般是抽象類,持有實現部分的引用
一個實現部分的抽象角色—一般是接口,定義實現部分的行爲方法
一個或多個具體的抽象部分實現—繼承抽象部分角色,對抽象部分進行具體的行爲擴展
一個或多個實現部分抽象的實現—實現部分的具體行爲
可能有些難理解,但是仔細想想:抽象部分、實現部分分離、那必然是二者之間通過抽象進行依賴,各自獨立變化,而抽象部分本身就是抽象的,可以獨立變化,因此對實現部分進行抽象,然後使之對外依賴。
實現
/**
* 抽象部分
*/
public abstract class Abstraction {
/**
* 抽象部分持有實現部分的引用(通過抽象進行依賴,各自獨立變化)
*/
private AbsImplementor implementor;
public Abstraction(AbsImplementor implementor) {
this.implementor = implementor;
}
/**
* 通過調用實現部分的具體方法實現具體邏輯
*/
public void operation() {
implementor.operationImpl();
}
}
/**
* 實現部分的抽象定義
*/
public interface AbsImplementor {
/**
* 實現部分的抽象方法定義
*/
void operationImpl();
}
/**
* 實現部分的具體實現A
*/
public class ConcreteImplementorA implements AbsImplementor {
@Override
public void operationImpl() {
//具體實現邏輯
}
}
/**
* 抽象部分的具體實現
*/
public class ConcreteTraction extends Abstraction {
public ConcreteTraction(AbsImplementor implementor) {
super(implementor);
}
public void refinedOperation() {
//對抽象部分進行擴展
}
}
使用
AbsImplementor implementor = new ConcreteImplementorA();
Abstraction traction = new ConcreteTraction(implementor);
traction.operation();
小結
優點
將抽象和實現分離,使得系統具有靈活的擴展性,各自可以獨立變化且對客戶端透明的實現
缺點
類增多,抽象與實現分離難定義,如何分離