1. 程式人生 > >設計模式-結構型-橋接模式

設計模式-結構型-橋接模式

橋接模式(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.