今天講解的是結構型設計模式中的第二種——橋接模式。橋接——是指依據OSI網絡模型的鏈路層的地址,對網絡數據包進行轉發的過程,工做在OSI的第二層。通常的交換機,網橋就有橋接做用。這是百科解釋。那麼今天講的橋接模式是什麼呢?橋接是一個紐帶,近年的港珠澳大橋。就充當起三地鏈接的紐帶。那麼在設計模式中的橋接模式呢?也是同樣,其中組成也是經過橋接、紐帶鏈接。而後組合成所須要的東西的。咱們具體看看其橋接模式的具體意義吧。html
在咱們面對系統程序開發設計的時候,有時候會面臨着一些類會存在兩個維度的變化,在有多種可能會變化的狀況下,用繼承會形成較爲複雜的程序後果、擴展起來不那麼靈活。那麼如何去面對多個角度的分類而且多個角度均可能變化的狀況呢?這就須要橋接模式了。android
將抽象部分與實現部分分離,使它們均可以獨立地變化。ios
看上面案例圖顯示,咱們能夠知道橋接模式包括如下部分:設計模式
1、抽象化角色:抽象化給出定義,包含一個對實現化對象的引用網絡
2、具體抽象化角色:擴展實現抽象化角色ide
3、實現化角色:這個角色給出實現化角色的接口,但不具體實現。這個 角色與抽象化角色不必定須要相同。相反能夠徹底不一樣。至關於抽象化 角色對應的是一個維度,而實現化角色對應的是第二個維度。
4、具體實現化角色:擴展實現實現化角色函數
咱們看這麼一個案例。世人皆知手機有安卓和IOS類型。那麼對於軟件來講也是須要適配兩種類型的。同時呢軟件也是在不斷迭代更新的。就這樣而言。對於一個手機軟件。咱們暫且看兩個維度。1、迭代更新版本。2、適用於手機類型。若是採用繼承的方式解決此類型問題將會大大的加大系統的複雜度。這裏咱們就能夠採用橋接模式。咱們一塊兒看看代碼如何實現其設計的吧:this
namespace Bridge_Pattern { class BridgePattern { } #region 抽象化角色——迭代更新的版本(包含對實現化角色對象的引用)======== public abstract class Version { /// <summary> /// 實現對實現化對象的引用,經過組合實現軟件迭代更新並適用於不一樣平臺的功能 /// </summary> protected PhoneType _phoneType; /// <summary> /// 構造函數注入,實現化對象的初始化 /// </summary> /// <param name="phoneType"></param> public Version(PhoneType phoneType) { this._phoneType = phoneType; } /// <summary> /// 建立軟件版本 /// </summary> public abstract void Create(); } #endregion #region 實現化角色——適用於手機類型============================================= public abstract class PhoneType { /// <summary> /// 適配手機類型 /// </summary> public abstract void SetType(); } #endregion #region 具體抽象化角色——具體實際迭代更新的版本=========== /// <summary> /// 版本1.0 /// </summary> public class OneVersion : Version { public OneVersion(PhoneType phoneType) :base(phoneType) { } public override void Create() { Console.WriteLine("當前版本1.0"); this._phoneType.SetType(); } } /// <summary> /// 當前版本2.1 /// </summary> public class TwoVersion : Version { public TwoVersion(PhoneType phoneType) : base(phoneType) { } public override void Create() { Console.WriteLine("當前版本2.0"); this._phoneType.SetType(); } } #endregion #region 具體實現化角色——具體實際使用類型=================== /// <summary> /// 安卓系統 /// </summary> public class AndroidPhoneType : PhoneType { public override void SetType() { Console.WriteLine("當前是Android類型"); } } /// <summary> /// ios系統 /// </summary> public class IOSPhoneType : PhoneType { public override void SetType() { Console.WriteLine("當前是IOS類型"); } } #endregion }
class Program { static void Main(string[] args) { ///1.0版本軟件 安卓系統 AndroidPhoneType androidPhoneType = new AndroidPhoneType(); OneVersion oneVersion = new OneVersion(androidPhoneType); oneVersion.Create(); ///2.0 版本軟件 IOS系統 IOSPhoneType iOSPhoneType = new IOSPhoneType(); TwoVersion twoVersion = new TwoVersion(iOSPhoneType); twoVersion.Create(); Console.ReadLine(); } }
一、若是系統須要在抽象化角色和實現化角色之間構建增長一些靈活性,避免採用繼承類的形式。能夠採用橋接模式創建關聯關係spa
二、若是系統不但願採用繼承形式或者繼承形式會致使系統極爲複雜,能夠考慮採用橋接模式設計
三、若是一個類存在兩個維度,且兩個維度都常變化擴展,使用橋接模式再適合不過了
一、將抽象接口與實現解耦分離
二、抽象與實現相互分離,易擴展
三、實現的細節對用戶透明
一、增長了系統的理解難度及設計難度
橋接模式。意如其名。就是將一個類中兩個維度進行分離開來。將抽象接口與實現解耦。而後經過組合橋接關聯在一塊兒。組合使用。其兩個對象都是抽象,而後其子類具體實踐。由抽象接口對實現化角色的對象的引用來關聯。橋接模式適合用於兩個維度常變化的類。把多角度分離出來,而後讓他們獨立變化,減小耦合。
天再高又怎樣,踮起腳尖就更接近陽光。
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!