C#設計模式系列:橋接模式(Bridge)
1.1定義
當一個抽象可能有多個實現時,通常用繼承來進行協調。抽象類定義對該抽象的接口,而具體的子類則用不同的方式加以實現。繼承機制將抽象部分與它的實現部分固定在一起,使得難以對抽象部分和實現部分獨立地進行修改、擴充和重用。
如果一個抽象類或接口有多個具體實現子類,而這些子類之中有內容或概念上重疊,需要我們把抽象的共同部分各自獨立開來:即原來是準備放在一個接口裏,現在需要設計兩個接口——抽象接口和行為接口。然後再分別針對各自的具體子類定義抽象接口和行為接口的方法和調用關系。
橋接模式的用意是將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化。
抽象化(Abstraction)
存在於多個實體中的共同的概念性聯系,即為抽象化。作為一個過程,抽象化就是忽略一些信息,從而把不同的實體當做同樣的實體對待。
實現化(Implementation)
抽象化給出的具體實現,即為實現化。
脫耦
耦合是指兩個對象的行為的某種強關聯,脫耦則是要去掉它們之間的強關聯。在這裏,脫耦是指將抽象化和實現化之間的耦合解脫,或者將它們之間的強關聯改換成弱關聯。將兩者之間的繼承關系改為聚合關系,就是將它們之間的強關聯改換成為弱關聯。
橋接模式中的脫耦,是指抽象化和實現化之間使用組合/聚合關系,而不是繼承關系,從而使兩者可以相對獨立地變化。
1.2橋接模式結構圖
1.3 橋接模式代碼實現
/// <summary>/// Implementor類 /// </summary> public abstract class Implementor { public abstract void OperationImp(); }
/// <summary> /// ConcreteImplementorA RefinedAbsractionB等派生類 /// </summary> public class ConcreteImplementorA: Implementor { public overridevoid OperationImp() { Console.WriteLine("具體實現A方法的執行"); } } public class ConcreteImplementorB : Implementor { public override void OperationImp() { Console.WriteLine("具體實現B方法的執行"); } }
/// <summary> /// Abstraction抽象類 /// </summary> public abstract class Abstraction { protected Implementor Implementor; public void SetImpor(Implementor imp) { this.Implementor = imp; } public virtual void Operation() { Implementor.OperationImp(); } }
/// <summary> /// 被提煉的抽象 /// </summary> public class RefinedAbsraction : Abstraction { public override void Operation() { Implementor.OperationImp(); } }
static void Main(string[] args) { ///客戶端調用 Abstraction ab = new RefinedAbsraction(); ab.SetImpor(new ConcreteImplementorA()); ab.Operation(); ab.SetImpor(new ConcreteImplementorB()); ab.Operation(); }
結果
具體實現A方法的執行 具體實現B方法的執行 請按任意鍵繼續. . .
1.4 橋接模式應用分析
橋接模式可以適用於以下情形:
? 不希望在抽象與實現部分之間有固定的綁定關系;
? 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時橋接模式可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充;
? 對抽象的實現部分進行修改應對客戶不產生影響,即客戶的代碼不必重新編譯;
? 想對客戶完全隱藏抽象的實現部分;
? 想在多個對象間共享實現,但同時要求客戶並不知道這點。
橋接模式具有以下特點:
? 分離接口及其實現部分,一個實現未必不變地綁定在一個接口上。抽象類的實現可以在運行時刻進行配置,一個對象甚至可以在運行時刻改變它的實現;
? 將Abstraction與Implementor分離有助於降低對實現部分編譯時刻的依賴性;當改變一個實現類時,並不需要重新編譯Abstraction類和Client類。為了保證一個類庫的不同版本之間的兼容,需要有這個特性;
? 接口與實現分離有助於分層,從而產生更好的結構化系統。系統的高層部分僅需要知道Abstraction和Implementor即可;
? 提高可擴充性。可以獨立的對Abstraction和Implementor層次結構進行擴充;
? 實現細節對Client透明。可以對Client隱藏實現細節,如共享Implementor對象以及相應的引用計數機制。
C#設計模式系列:橋接模式(Bridge)