設計模式篇——初探橋接模式

文章目錄

一、橋接模式介紹ios

二、橋接模式類圖設計模式

三、橋接模式Demo實現(移動互聯網時代的手機設計)iphone

四、橋接模式總結ide

橋接模式介紹:

  橋接模式將變化封裝,使用組合的方式將變化的抽象放到類中,屬於結構形設計模式。this

類圖:

一個簡單的Demo(移動互聯網時代的手機設計):

  如今,咱們有一個手機的抽象基類BasePhone,它有獲取它的操做系統(abstract string System()),獲取它的版本號(abstract string Version())和打電話(abstract void Call())三個功能。接下來,咱們有三部手機,分別是Iphone,xiaomi,winphone。分別是IOS 9.0操做系統,Android 6.0操做系統,Windows 10.0操做系統。用代碼來實現下。spa

 1     /// <summary>
 2     /// 手機抽象類
 3     /// </summary>
 4     public abstract class BasePhone
 5     {
 6         /// <summary>
 7         /// 操做系統
 8         /// </summary>
 9         /// <returns></returns>
10         public abstract string System();
11         /// <summary>
12         /// 版本
13         /// </summary>
14         /// <returns></returns>
15         public abstract string Version();
16         /// <summary>
17         /// 打電話
18         /// </summary>
19         public abstract void Call();
20     }
BasePhone
 1     /// <summary>
 2     /// 微軟手機
 3     /// </summary>
 4     public class WinPhone : BasePhone
 5     {
 6         public override void Call()
 7         {
 8             Console.WriteLine($"{this.GetType().Name}手機是{this.System()}的操做系統,版本爲{this.Version()}");
 9         }
10 
11         public override string System()
12         {
13             return "Windows";
14         }
15 
16         public override string Version()
17         {
18             return "10.0";
19         }
20     }
WinPhone
 1     /// <summary>
 2     /// 小米手機
 3     /// </summary>
 4     public class XiaomiPhone:BasePhone
 5     {
 6 
 7         public override string System()
 8         {
 9             return "Android";
10         }
11 
12         public override string Version()
13         {
14             return "6.2";
15         }
16         public override void Call()
17         {
18             Console.WriteLine($"{this.GetType().Name}手機是{this.System()}的操做系統,版本爲{this.Version()}");
19         }
20     }
XiaomiPhone
 1     /// <summary>
 2     /// IPhone手機
 3     /// </summary>
 4     public class IPhone : BasePhone
 5     {
 6         public override string System()
 7         {
 8             return "IOS";
 9         }
10 
11         public override string Version()
12         {
13             return "9.0";
14         }
15 
16         public override void Call()
17         {
18             Console.WriteLine($"{this.GetType().Name}手機是{this.System()}的操做系統,版本爲{this.Version()}");
19         }
20     }
IPhone

接下來分別調用一下它們打電話的方法,這裏打電話輸出一下手機類型,操做系統和版本號。操作系統

1             //用一臺小米打電話
2             BasePhone xiaomi = new XiaomiPhone();
3             xiaomi.Call();
4             //用一臺Winphone打電話
5             BasePhone winphone = new WinPhone();
6             winphone.Call();
7             //用一臺iphone打電話
8             BasePhone iphone = new IPhone();
9             iphone.Call();
顯示調用Call方法

  咱們知道,手機是能夠刷機的,例如咱們能夠給咱們的Winphone手機刷一個IOS操做系統。這樣咱們就須要實現這樣一個手機類WinPhoneIOSsystem。內部方法System返回操做系統爲IOS,Version返回版本好爲9.0,以下所示。設計

 1     /// <summary>
 2     /// 微軟手機
 3     /// </summary>
 4     public class WinPhoneIOSsystem : BasePhone
 5     {
 6         public override void Call()
 7         {
 8             Console.WriteLine($"{this.GetType().Name}手機是{this.System()}的操做系統,版本爲{this.Version()}");
 9         }
10 
11         public override string System()
12         {
13             return "IOS";
14         }
15 
16         public override string Version()
17         {
18             return "9.0";
19         }
20     }
WinPhoneIOSsystem
1             BasePhone winphoneWithIOS = new WinPhoneIOSsystem();
2             winphoneWithIOS.Call();
調用一下ios系統的winphone手機

以這樣的方式來實現,那咱們能夠三種手機分別刷三種系統,就須要3*3個子類。這樣顯然是不合適。這時候咱們就能夠使用橋接模式來解決這個問題。由於咱們的操做系統和版本號是能夠改變的,那麼咱們能夠把它單獨封裝3d

起來,這裏使用一個接口ISystem來實現,這個接口有兩個方法分別是操做系統版本和操做系統版本號。。code

1     /// <summary>
2     /// 操做系統
3     /// </summary>
4     public interface ISystem
5     {
6         string System();
7         string Version();
8     }
ISystem

一樣,分別把三個操做系統實現。

 1     /// <summary>
 2     /// 安卓操做系統
 3     /// </summary>
 4     public class Android : ISystem
 5     {
 6         public string System()
 7         {
 8             return "Android";
 9         }
10 
11         public string Version()
12         {
13             return "6.3";
14         }
15     
Android
IOS
Windows

這時咱們修改下咱們的手機基類,將操做系統和版本放到變量system中去。這個變量由子類實現時候給它初始化。

 1     /// <summary>
 2     /// 手機抽象類
 3     /// </summary>
 4     public abstract class BasePhone
 5     {
 6         /// <summary>
 7         /// 操做系統和版本號封裝到Isystem接口
 8         /// </summary>
 9         public ISystem system;
10 
11 
12         ///// <summary>
13         ///// 操做系統
14         ///// </summary>
15         ///// <returns></returns>
16         //public abstract string System();
17         ///// <summary>
18         ///// 版本
19         ///// </summary>
20         ///// <returns></returns>
21         //public abstract string Version();
22 
23 
24         /// <summary>
25         /// 打電話
26         /// </summary>
27         public abstract void Call();
28     }
BasePhone

修改後的手機子類以下所示。

 1     /// <summary>
 2     /// 小米手機
 3     /// </summary>
 4     public class XiaomiPhone:BasePhone
 5     {
 6         public override void Call()
 7         {
 8 
 9             if (this.system == null)
10                 throw new Exception("請初始化操做系統");
11             Console.WriteLine($"{this.GetType().Name}手機是{this.system.System()}的操做系統,版本爲{this.system.Version()}");
12         }
13     }
XiaomiPhone
 1     /// <summary>
 2     /// 微軟手機
 3     /// </summary>
 4     public class WinPhone : BasePhone
 5     {
 6         public override void Call()
 7         {
 8 
 9             if (this.system == null)
10                 throw new Exception("請初始化操做系統");
11             Console.WriteLine($"{this.GetType().Name}手機是{this.system.System()}的操做系統,版本爲{this.system.Version()}");
12         }
13     }
WinPhone
 1     /// <summary>
 2     /// IPhone手機
 3     /// </summary>
 4     public class IPhone : BasePhone
 5     {
 6         public override void Call()
 7         {
 8             if (this.system == null)
 9                 throw new Exception("請初始化操做系統");
10             Console.WriteLine($"{this.GetType().Name}手機是{this.system.System()}的操做系統,版本爲{this.system.Version()}");
11         }
12     }
IPhone

這時候咱們給一臺小米手機使用IOS操做系統就能以下所示。

此時,咱們不一樣的「手機(實現類)」刷不一樣的"系統(抽象)",所須要的實現類個數爲 M + N 就能夠完成了。(M手機類型,N系統類型)相比以前的方式實現個數爲M*N,減小了大量實現類。

橋接模式總結

  • 橋接模式將實現予以解耦,將變化的部分獨立封裝起來。
  • 抽象部分和實現部分能夠獨立擴展,不會影響到對方。
  • 橋接模式使上端(客戶端)知道了更多的細節,增長了代碼的複雜度。
相關文章
相關標籤/搜索