橋接模式-解決多維度變化的問題
橋接模式定義
將抽象和實現放在兩個不同的類層次結構中,使得兩者可以獨立變化。
橋接模式結構圖
橋接模式角色介紹
抽象化角色:Abstraction,用於定義抽象類的介面,同時定義了一個Implementor(實現化介面)型別的物件。
擴充抽象類角色:RefinedAbstraction,繼承抽象類,它實現了在Abstraction中宣告的抽象業務方法,在RefinedAbstraction中可以呼叫在Implementor中定義的業務方法。
實現化介面角色:Implementor,一個介面或者抽象類,定義實現化類層次結構行為。
具體實現類角色:ConcreteImplementor,實現Implementor介面,在不同的ConcreteImplementor中提供基本操作的不同實現。
橋接模式結構程式碼
實現化角色:
public interface Implementor {
void operationImp();
}
具體實現類角色:
public class ConcreteImplementor implements Implementor {
public void operationImp() {
System.out.println("我是實現化層次結構的功能");
}
}
抽象化角色:
public abstract class Abstraction { protected Implementor implementor; public Abstraction(Implementor implementor) { this.implementor = implementor; } public abstract void operation(); public abstract void doSometing(); }
擴充抽象類角色:
public class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor implementor){ super(implementor); } public void operation() { implementor.operationImp(); } public void doSometing() { System.out.println("doSometiongnvnvnnnnvnnv"); } }
橋接模式執行機制
先說一下類的多維度變化,類的多維度也就是類具有的多個屬性,每個屬性的差異都通過子類繼承的方式實現,各個屬性之間就會相互干擾,不需要變化的屬性要隨變化的屬性擴張到各個子類中。
橋接模式就是把類的多個屬性按照屬性維度進行拆分到不同的類中,每個類只負責一個屬性變化。選擇其中一個屬性作為抽象類層次結構,其它作為實現類層次結構。抽象類層次結構與實現類層次結構屬於聚合關聯關係。
那拆分過程誰作為抽象類層次結構、誰作為實現類層次結構呢?我總結了兩個原則:
1、把直接與客戶端對接的屬性作為抽象類層次結構,間接對接的屬性作為實現類層次結構。比如客戶端使用遙控器操作電視,遙控器種類不同,電視種類也不同,但客戶端直接操作的是遙控器,此時把遙控器這個類層次結構作為抽象層次結構,把電視機作為實現類層次結構。
2、把差異性數量最少的屬性作為抽象類層次結構。比如客戶選擇咖啡的種類和咖啡杯子的型號,明顯杯子型號這個屬性差異性數量少於咖啡種類這個屬性差異性。所以此時把咖啡杯子的型號作為抽象類層次結構,把咖啡種類作為實現類層次結構。
橋接模式解決的核心問題
橋接模式解決的是類屬性多維度變化問題,把類的抽象層次結構和類的實現層級結構解耦,這個解耦主要指的是子類繼承層面,通過組合的形式,實現各個屬性類可以獨立變化。