一、橋接模式介紹ios
二、橋接模式類圖設計模式
三、橋接模式Demo實現(移動互聯網時代的手機設計)iphone
四、橋接模式總結ide
橋接模式將變化封裝,使用組合的方式將變化的抽象放到類中,屬於結構形設計模式。this
如今,咱們有一個手機的抽象基類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 }
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 }
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 }
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 }
接下來分別調用一下它們打電話的方法,這裏打電話輸出一下手機類型,操做系統和版本號。操作系統
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();
咱們知道,手機是能夠刷機的,例如咱們能夠給咱們的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 }
1 BasePhone winphoneWithIOS = new WinPhoneIOSsystem(); 2 winphoneWithIOS.Call();
以這樣的方式來實現,那咱們能夠三種手機分別刷三種系統,就須要3*3個子類。這樣顯然是不合適。這時候咱們就能夠使用橋接模式來解決這個問題。由於咱們的操做系統和版本號是能夠改變的,那麼咱們能夠把它單獨封裝3d
起來,這裏使用一個接口ISystem來實現,這個接口有兩個方法分別是操做系統版本和操做系統版本號。。code
1 /// <summary> 2 /// 操做系統 3 /// </summary> 4 public interface ISystem 5 { 6 string System(); 7 string Version(); 8 }
一樣,分別把三個操做系統實現。
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
這時咱們修改下咱們的手機基類,將操做系統和版本放到變量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 }
修改後的手機子類以下所示。
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 }
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 }
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 }
這時候咱們給一臺小米手機使用IOS操做系統就能以下所示。
此時,咱們不一樣的「手機(實現類)」刷不一樣的"系統(抽象)",所須要的實現類個數爲 M + N 就能夠完成了。(M手機類型,N系統類型)相比以前的方式實現個數爲M*N,減小了大量實現類。