c#橋接模式詳解

2023-11-13 09:00:39

基礎介紹:

  將抽象部分與它的實現部分分離,使它們都可以獨立地變化。適用於不希望在抽象和實現部分之間有固定的繫結關係的情況,或者類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充的情況。

  將抽象部分與實現部分分離,使它們都可以獨立地變化。

  其實兩個都是抽象的部分,更準確的說,是將一個事物中多個維度的變化分離

  比如不用軟體執行在不同的作業系統上。

  作業系統是一個維度,分為ios、Android、Windows等。

  軟體系統是一個維度,分別為微信、QQ、酷狗音樂等。

  一個維度可以認為是抽象部分,另一個維度可以認為是實現部分,而這兩個維度可以獨立擴充和維護。

  單獨看起來比較複雜和難以理解,可以先大致看下基礎結構,然後結合以下範例來解讀。

  橋接模式的結構:

    Abstraction:定義抽象類的介面,一般為抽象類,規範RefinedAbstraction,並建立一個Implementor範例。主要靠這個類來進行橋接。

    RefinedAbstraction:Abstraction的子類,具體實現Abstraction裡規定的方法。

    Implementor:定義實現類的介面,一般情況,Implementor介面僅為提供基本操作,而Abstraction則定義了基於基本操作的較高層次操作。

    ConcreteImplementor:Implementor的子類,具體實現Implementor介面 。

  在橋接模式中,兩個類Abstraction和Implementor分別定義了抽象與行為型別的介面,通過呼叫子類實現抽象與行為的動態組合。

應用場景:

  適用於不希望在抽象和實現部分之間有固定的繫結關係的情況,或者類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充的情況。

建立方式:

  橋接模式的實現方式是通過在抽象類中持有一個指向實現類的參照,從而將抽象類與實現類解耦。

  通常情況下,抽象類和實現類都需要定義自己的介面,以便彼此之間進行通訊。

 

範例一:不用軟體執行在不同的作業系統上。

   作業系統是一個維度,分為ios、Android、Windows等。

   軟體系統是一個維度,分別為微信、QQ、酷狗音樂等。

   這兩個維度可以獨立擴充和維護,一個維度可以認為是抽象部分,另一個維度可以認為是實現部分。

   實現部分中的介面(Implementor)只需提供基本操作,抽象部分中的介面(Abstraction)來建立一個實現介面(Implementor)範例,用這個範例將兩部分緊密連續在一起。

   抽象部分也是基於這個範例才做一些較高層次的操作。

   在這裡可以把作業系統當做抽象部分,把軟體系統當做實現部分。

   在抽象部分中建立一個抽象類(Abstraction),該類中建立一個軟體系統的範例,即實現類的範例(Implementor),並規定抽象部分具體實現類(RefinedAbstraction)要實現哪些方法。

   注:抽象類和介面主要起橋樑作用和規範作用(Abstraction和Implementor),其具體實現都在其子類中(RefinedAbstraction和ConcreteImplementor)。

   在實現部分中建立一個介面(Implementor),該介面主要規範實現類(ConcreteImplementor)需要實現的方法。

   RefinedAbstraction和ConcreteImplementor分別繼承自Abstraction和Implementor,並實現其規定的方法。

   即:

     Abstraction ---》作業系統抽象類

     RefinedAbstraction---》ios、Android、Windows等具體實現

     Implementor----》軟體介面類

     ConcreteImplementor---》微信、QQ、酷狗音樂等具體實現

1、軟體介面類

 1     /// <summary>
 2     /// 軟體介面類
 3     /// </summary>
 4     public interface ISoftWare
 5     {
 6         /// <summary>
 7         /// 定義一個軟體啟動方法
 8         /// </summary>
 9         void Start();
10     }

Implementor-實現類介面,只宣告最基本的方法。

2、軟體實現類

 1     /// <summary>
 2     /// 微信
 3     /// </summary>
 4     public class WeChat : ISoftWare
 5     {
 6         public void Start()
 7         {
 8             Console.WriteLine("啟動微信");
 9         }
10     }
11 
12     /// <summary>
13     /// QQ
14     /// </summary>
15     public class TencentQQ : ISoftWare
16     {
17         public void Start()
18         {
19             Console.WriteLine("啟動QQ");
20         }
21     }

ConcreteImplementor-繼承自實現類介面,實現其基本方法。

3、系統抽象類

 1     /// <summary>
 2     /// 系統抽象類(橋接類)
 3     /// </summary>
 4     public abstract class SystemPlatform
 5     {
 6         //建立軟體類範例
 7         public ISoftWare _softWare;
 8 
 9         //通過建構函式注入具體軟體範例
10         public SystemPlatform(ISoftWare softWare)
11         {
12             this._softWare = softWare;
13         }
14 
15         //執行軟體執行
16         public abstract void Run();
17     }

Abstraction-作業系統抽象類,建立一個實現類範例,用來存取實現類內的操作。

該類為實際的橋接類,其他還規範了更高一層的方法。

4、系統平臺實現類

 1     /// <summary>
 2     /// ios系統
 3     /// </summary>
 4     public class IosSys : SystemPlatform
 5     {
 6         public IosSys(ISoftWare softWare) 
 7             : base(softWare)
 8         {
 9             Console.WriteLine("進入IOS系統");
10         }
11         public override void Run()
12         {
13             _softWare.Start();
14         }
15     }
16 
17     /// <summary>
18     /// Android系統
19     /// </summary>
20     public class AndroidSys : SystemPlatform
21     {
22         public AndroidSys(ISoftWare softWare)
23            : base(softWare)
24         {
25             Console.WriteLine("進入Android系統");
26         }
27         public override void Run()
28         {
29             _softWare.Start();
30         }
31     }

RefinedAbstraction-系統抽象具體實現類,實現了各個實際功能。

 5、使用者端

 1     /// <summary>
 2     /// 使用者端
 3     /// </summary>
 4     class Client
 5     {
 6         static void Main(string[] args)
 7         {
 8             //建立軟體物件
 9             WeChat weChat = new WeChat();
10             TencentQQ tencentQQ = new TencentQQ();
11 
12             //建立作業系統並安裝軟體
13             SystemPlatform systemPlatform = new IosSys(weChat);
14             systemPlatform.Run();
15 
16             systemPlatform = new AndroidSys(tencentQQ);
17             systemPlatform.Run();
18 
19             Console.ReadKey();
20         }
21     }

這只是一個簡單的範例,如果一個系統中預裝載多個軟體,可以將建構函式改為集合引數或者申明其他公開方法進行預安裝。

 

範例二:不同形狀的物體賦予不同顏色。

   不同形狀的物體是一個維度,分別為長方形、矩形、圓形等。

   不同顏色是一個維度,分別為白色、黑色、紅色等。

   即:

    Abstraction ---》形狀抽象類

    RefinedAbstraction---》方形 圓形等具體實現

    Implementor----》顏色介面類

    ConcreteImplementor---》白色 黑色等具體實現

1、顏色介面類

1     public interface Color
2     {
3         void Bepaint();
4     }

規範顏色實現類,並供形狀抽象類使用和維護。

2、顏色實現類

 1     public class White : Color
 2     {
 3         public void Bepaint()
 4         {
 5             Console.WriteLine("白色的");
 6         }
 7     }
 8 
 9     public class Gray : Color
10     {
11         public void Bepaint()
12         {
13             Console.WriteLine("灰色的");
14         }
15     }
16 
17     public class Black : Color
18     {
19         public void Bepaint()
20         {
21             Console.WriteLine("黑色的");
22         }
23     }

3、形狀抽象類

1     public abstract class Shape
2     {
3         public Color color;
4         public void SetColor(Color color)
5         {
6             this.color = color;
7         }
8         public abstract void Draw();
9     }

建立顏色範例供實現類使用,並規範實現類。

這個類主要是將形狀和顏色兩個維度的東西聯絡在一起,並制定高一級的操作規範。

4、形狀實現類

 1     public class Circle : Shape
 2     {
 3         public override void Draw()
 4         {
 5             color.Bepaint();
 6             Console.WriteLine("圓形");
 7         }
 8     }
 9     public class Rectangle : Shape
10     {
11 
12         public override void Draw()
13         {
14             color.Bepaint();
15             Console.WriteLine("長方形");
16         }
17     }
18     public class Square : Shape
19     {
20         public override void Draw()
21         {
22             color.Bepaint();
23             Console.WriteLine("正方形");
24         }
25     }

具體實現類

5、使用者端

 1     class Client
 2     {
 3         static void Main(string[] args)
 4         {
 5             //白色
 6             Color white = new White();
 7             //正方形
 8             Shape square = new Square();
 9             //白色的正方形
10             square.SetColor(white);
11             square.Draw();
12 
13             //長方形
14             Shape rectange = new Rectangle();
15             rectange.SetColor(white);
16             rectange.Draw();
17 
18             Console.ReadKey();
19         }
20     }

其實顏色和形狀兩個維度的東西,各自維護和發展並不互相影響。

使用的時候也是將一個維度的東西加裝的另一個維度上去,搭建一個橋樑供另一個維度去使用。

至於怎麼載入就無所謂了,可以在建構函式中指定,也可以在方法引數中傳遞。

總結:

  將抽象部分與它的實現部分分離,使它們都可以獨立地變化

  橋接模式的實現方式是通過在抽象類中持有一個指向實現類的參照,從而將抽象類與實現類解耦。

  通常情況下,抽象類和實現類都需要定義自己的介面,以便彼此之間進行通訊。