橋接模式(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 ImageImp16 {17 void DoPaint();18 }19 20 /// <summary>21 /// Windows作業系統實作類,充當具體實作類22 /// </summary>23 internal class WindowsImp : ImageImp24 {25 public void DoPaint()26 {27 Console.WriteLine("在Windows作業系統中顯示影像");28 }29 }30 31 /// <summary>32 /// Linux作業系統實作類,充當具體實作類33 /// </summary>34 internal class LinuxImp : ImageImp35 {36 public void DoPaint()37 {38 Console.WriteLine("在Linux作業系統中顯示影像");39 }40 }41 42 /// <summary>43 /// 抽象影像類,充當抽象類44 /// </summary>45 internal abstract class Image46 {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 : Image61 {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 : Image73 {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.uj5u.com/ruanti/44343.html
標籤:設計模式
上一篇:SSH框架之Spring第四篇
下一篇:裝飾者模式,從吃黃燜雞開始說起
