橋接模式(Bridge): 橋接是用於把抽象化與實現化解耦,使得兩者可以獨立變化。 橋接模式的角色: 1)抽象化角色(Abstraction):它是用於定義抽象介面,通常是抽象類而不是介面,其中定義了一個Implementor(實現介面)類型的對象並可以維護該對象,它與Implementor之間具有 ...
橋接模式(Bridge):
橋接是用於把抽象化與實現化解耦,使得兩者可以獨立變化。
橋接模式的角色:
1)抽象化角色(Abstraction):它是用於定義抽象介面,通常是抽象類而不是介面,其中定義了一個Implementor(實現介面)類型的對象並可以維護該對象,它與Implementor之間具有關聯關係。
2)改善後的抽象化角色(RefinedAbstraction):通常是具體類,實現了Abstraction中的抽象方法,在RefinedAbstraction中可以調用Implementor中定義的方法。
3)實現者角色(Implementor):通常情況下提供一些基本操作的聲明,將具體實現交給其子類。
4)具體的實現者角色(ConcreteImplementorA、ConcreteImplementorB):實現了Implementor種定義的方法,運行時根據里氏替換原則,ConcreteImplementor對象將替換其父類對象,提供給抽象對象類具體的業務操作方法。
為什麼使用橋接模式?
我們都知道遙控器的通用功能是開機、關機,早先我們的做法應該是這樣的:創建一個抽象遙控器類,裡面定義開機、關機的一組方法,然後創建具體的遙控器類去繼承或實現這個介面,這樣就可以滿足每個電視機的需求。但突然有一天,客戶覺得這個遙控器的功能太少了,需要增加一個返回按鈕,這個時候你傻眼了,你給抽象類添加了一個新方法,突然發現程式大面積報錯,原因是子類未實現父類方法,於是霹靂巴拉一通改。好不容易改好了,客戶又說了:想要一個菜單功能,於是....
從上面的例子看出,這種設計違背了OCP原則,原因是類與類之間的耦合性過高,那怎樣降低耦合呢?橋接模式是用於把抽象化和實現化解耦,使得兩者可以獨立變化。
案例:
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 ImageImp image = new WindowsImp(); 6 Image img = new JPGImage(); 7 img.SetImageImp(image); 8 img.ParseFile("中國地圖"); 9 } 10 } 11 12 /// <summary> 13 /// 抽象操作系統實現類 14 /// </summary> 15 internal interface ImageImp 16 { 17 void DoPaint(); 18 } 19 20 /// <summary> 21 /// Windows操作系統實現類,充當具體實現類 22 /// </summary> 23 internal class WindowsImp : ImageImp 24 { 25 public void DoPaint() 26 { 27 Console.WriteLine("在Windows操作系統中顯示圖像"); 28 } 29 } 30 31 /// <summary> 32 /// Linux操作系統實現類,充當具體實現類 33 /// </summary> 34 internal class LinuxImp : ImageImp 35 { 36 public void DoPaint() 37 { 38 Console.WriteLine("在Linux操作系統中顯示圖像"); 39 } 40 } 41 42 /// <summary> 43 /// 抽象圖像類,充當抽象類 44 /// </summary> 45 internal abstract class Image 46 { 47 protected ImageImp imp; 48 49 public void SetImageImp(ImageImp imp) 50 { 51 this.imp = imp; 52 } 53 54 public abstract void ParseFile(string fileName); 55 } 56 57 /// <summary> 58 /// JPG格式圖像類,充當擴充抽象類 59 /// </summary> 60 internal class JPGImage : Image 61 { 62 public override void ParseFile(string fileName) 63 { 64 imp.DoPaint(); 65 Console.WriteLine("{0},格式為JPG", fileName); 66 } 67 } 68 69 /// <summary> 70 /// PNG格式圖像類,充當擴充抽象類 71 /// </summary> 72 internal class PNGImage : Image 73 { 74 public override void ParseFile(string fileName) 75 { 76 imp.DoPaint(); 77 Console.WriteLine("{0},格式為PNG", fileName); 78 } 79 }
橋接設計模式的優缺點:
優點:抽象介面與其實現解耦,其中的抽象和實現可以獨立的進行擴展,不會影響對方。
缺點:增加了系統的複雜度。
使用場景:
1)如果一個系統需要在構件的抽象化角色和具體化角色之間添加更多的靈活性,避免在兩個層次之間建立靜態的聯繫;
2)設計要求實現化角色的任何改變不應當影響客戶端,或者實現化角色的改變對客戶端是完全透明的;
3)需要跨越多個平臺的圖形和視窗系統上;
4)一個類存在兩個獨立變化的維度,且兩個維度都需要進行擴展。
1)橋接模式提出是為了使用變化的,即需求發生多維度變化怎麼辦?而適配器模式的提出是為瞭解決相容性問題,即由不相容到相容;代理模式提出主要是為了介面隔離。
參考:https://www.cnblogs.com/libingql/p/3496075.html
https://www.cnblogs.com/arxive/p/6909405.html