橋接模式(Bridge):html
橋接是用於把抽象化與實現化解耦,使得二者能夠獨立變化。設計模式
橋接模式的角色:ide
1)抽象化角色(Abstraction):它是用於定義抽象接口,一般是抽象類而不是接口,其中定義了一個Implementor(實現接口)類型的對象並能夠維護該對象,它與Implementor之間具備關聯關係。this
2)改善後的抽象化角色(RefinedAbstraction):一般是具體類,實現了Abstraction中的抽象方法,在RefinedAbstraction中能夠調用Implementor中定義的方法。spa
3)實現者角色(Implementor):一般狀況下提供一些基本操做的聲明,將具體實現交給其子類。操作系統
4)具體的實現者角色(ConcreteImplementorA、ConcreteImplementorB):實現了Implementor種定義的方法,運行時根據里氏替換原則,ConcreteImplementor對象將替換其父類對象,提供給抽象對象類具體的業務操做方法。設計
爲何使用橋接模式?3d
咱們都知道遙控器的通用功能是開機、關機,早先咱們的作法應該是這樣的:建立一個抽象遙控器類,裏面定義開機、關機的一組方法,而後建立具體的遙控器類去繼承或實現這個接口,這樣就能夠知足每一個電視機的需求。但忽然有一天,客戶以爲這個遙控器的功能太少了,須要增長一個返回按鈕,這個時候你傻眼了,你給抽象類添加了一個新方法,忽然發現程序大面積報錯,緣由是子類未實現父類方法,因而霹靂巴拉一通改。好不容易改好了,客戶又說了:想要一個菜單功能,因而....代理
從上面的例子看出,這種設計違背了OCP原則,緣由是類與類之間的耦合性太高,那怎樣下降耦合呢?橋接模式是用於把抽象化和實現化解耦,使得二者能夠獨立變化。code
案例:
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
原文出處:https://www.cnblogs.com/az4215/p/11570294.html