結構型模式之橋接模式
阿新 • • 發佈:2020-08-28
目錄
在現實生活中,某些類具有兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分。如何設計類似於 Photoshop 這樣的軟體,能畫不同形狀和不同顏色的圖形呢?如果用繼承方式,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但對應的子類很多,而且擴充套件困難。
當然,這樣的例子還有很多,如不同顏色和字型的文字、不同品牌和功率的汽車、不同性別和職業的男女、支援不同平臺和不同檔案格式的媒體播放器等。如果用橋接模式就能很好地解決這些問題。
定義與特點
橋接(Bridge)模式的定義如下:將抽象與實現分離,使它們可以獨立變化。它是用組合關係代替繼承關係來實現,從而降低了抽象和實現這兩個可變維度的耦合度
橋接(Bridge)模式的優點是:
- 由於抽象與實現分離,所以擴充套件能力強。
- 其實現細節對客戶透明。
缺點是:由於聚合關係建立在抽象層,要求開發者針對抽象化進行設計與程式設計,這增加了系統的理解與設計難度。
結構與實現
可以將抽象化部分與實現化部分分開,取消二者的繼承關係,改用組合關係。
模式的結構
橋接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色:定義抽象類,並包含一個對實現化物件的引用。
- 擴充套件抽象化(Refined Abstraction)角色:是抽象化角色的子類,實現父類中的業務方法,並通過組合關係調用實現化角色中的業務方法。
- 實現化(Implementor)角色
- 具體實現化(Concrete Implementor)角色:給出實現化角色介面的具體實現。
一般來講,Implementor介面僅提供基本操作,而Abstraction則定義了基於這些基本操作的較高層次的操作。
其結構圖如圖所示:
模式的實現
橋接模式的程式碼如下:
//訪問類 public class Program { static void Main(string[] args) { //橋接模式 IImplementor imple=new ConcreteImplementorA(); Abstraction abs=new RefinedAbstraction(imple); abs.Operation(); Console.ReadLine(); } } //實現化角色 public interface IImplementor { void OperationImpl(); } //具體實現化角色A public class ConcreteImplementorA : IImplementor { public void OperationImpl() { Console.WriteLine("具體實現化(Concrete Implementor)角色A被訪問" ); } } //抽象化角色 public abstract class Abstraction { protected IImplementor imple; protected Abstraction(IImplementor imple) { this.imple=imple; } public abstract void Operation(); } //擴充套件抽象化角色 public class RefinedAbstraction : Abstraction { public RefinedAbstraction(IImplementor imple): base(imple) { } public override void Operation() { Console.WriteLine("擴充套件抽象化(Refined Abstraction)角色被訪問"); imple.OperationImpl(); } }
程式的執行結果如下:
擴充套件抽象化(Refined Abstraction)角色被訪問
具體實現化(Concrete Implementor)角色被訪問
應用場景
橋接模式通常適用於以下場景:
- 當一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件時。
- 當一個系統不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加時。
- 當一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性時。
擴充套件:與介面卡模式聯合使用
在軟體開發中,有時橋接(Bridge)模式可與介面卡模式聯合使用。當橋接(Bridge)模式的實現化角色的介面與現有類的介面不一致時,可以在二者中間定義一個介面卡將二者連線起來,其具體結構圖如圖所示: