前言

            今天講解的是結(jié)構(gòu)型設(shè)計(jì)模式中的第二種——橋接模式。橋接——是指依據(jù)OSI <https://baike.baidu.com/item/OSI/5520>
          網(wǎng)絡(luò)模型 <https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B/239980>的
          鏈路層 <https://baike.baidu.com/item/%E9%93%BE%E8%B7%AF%E5%B1%82/10624635>的地址,對(duì)網(wǎng)絡(luò)
          數(shù)據(jù)包 <https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%8C%85/489739>進(jìn)行轉(zhuǎn)發(fā)的過程,工作在
          OSI <https://baike.baidu.com/item/OSI/5520>的第二層。一般的交換機(jī)
          <https://baike.baidu.com/item/%E4%BA%A4%E6%8D%A2%E6%9C%BA/103532>,網(wǎng)橋
          <https://baike.baidu.com/item/%E7%BD%91%E6%A1%A5/99310>
          就有橋接作用。這是百科解釋。那么今天講的橋接模式是什么呢?橋接是一個(gè)紐帶,近年的港珠澳大橋。就充當(dāng)起三地連接的紐帶。那么在設(shè)計(jì)模式中的橋接模式呢?也是一樣,其中組成也是通過橋接、紐帶連接。然后組合成所需要的東西的。我們具體看看其橋接模式的具體意義吧。

          橋接模式介紹

          一、來由


            在我們面對(duì)系統(tǒng)程序開發(fā)設(shè)計(jì)的時(shí)候,有時(shí)候會(huì)面臨著一些類會(huì)存在兩個(gè)維度的變化,在有多種可能會(huì)變化的情況下,用繼承會(huì)造成較為復(fù)雜的程序后果、擴(kuò)展起來不那么靈活。那么如何去面對(duì)多個(gè)角度的分類并且多個(gè)角度都可能變化的情況呢?這就需要橋接模式了。

          二、意圖

            將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。

          三、案例圖

          ?

          ?

          ?

          四、橋接模式代碼示例

            看上面案例圖顯示,我們可以知道橋接模式包括以下部分:

          一、抽象化角色:抽象化給出定義,包含一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用

          二、具體抽象化角色:擴(kuò)展實(shí)現(xiàn)抽象化角色

          三、實(shí)現(xiàn)化角色:這個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不具體實(shí)現(xiàn)。這個(gè) 角色與抽象化角色不一定需要相同。相反可以完全不同。相當(dāng)于抽象化
          角色對(duì)應(yīng)的是一個(gè)維度,而實(shí)現(xiàn)化角色對(duì)應(yīng)的是第二個(gè)維度。
          四、具體實(shí)現(xiàn)化角色:擴(kuò)展實(shí)現(xiàn)實(shí)現(xiàn)化角色


            我們看這么一個(gè)案例。世人皆知手機(jī)有安卓和IOS類型。那么對(duì)于軟件來說也是需要適配兩種類型的。同時(shí)呢軟件也是在不斷迭代更新的。就這樣而言。對(duì)于一個(gè)手機(jī)軟件。我們暫且看兩個(gè)維度。一、迭代更新版本。二、適用于手機(jī)類型。如果采用繼承的方式解決此類型問題將會(huì)大大的加大系統(tǒng)的復(fù)雜度。這里我們就可以采用橋接模式。我們一起看看代碼如何實(shí)現(xiàn)其設(shè)計(jì)的吧:

          ?  
          namespace Bridge_Pattern { class BridgePattern { } #region
          抽象化角色——迭代更新的版本(包含對(duì)實(shí)現(xiàn)化角色對(duì)象的引用)========public abstract class Version { ///
          <summary> /// 實(shí)現(xiàn)對(duì)實(shí)現(xiàn)化對(duì)象的引用,通過組合實(shí)現(xiàn)軟件迭代更新并適用于不同平臺(tái)的功能 /// </summary> protected
          PhoneType _phoneType;/// <summary> /// 構(gòu)造函數(shù)注入,實(shí)現(xiàn)化對(duì)象的初始化 /// </summary> ///
          <param name="phoneType"></param> public Version(PhoneType phoneType) { this
          ._phoneType = phoneType; } /// <summary> /// 創(chuàng)建軟件版本 /// </summary> public
          abstract void Create(); } #endregion #region
          實(shí)現(xiàn)化角色——適用于手機(jī)類型=============================================public abstract class
          PhoneType {/// <summary> /// 適配手機(jī)類型 /// </summary> public abstract void
          SetType(); }#endregion #region 具體抽象化角色——具體實(shí)際迭代更新的版本=========== /// <summary> ///
          版本1.0/// </summary> public class OneVersion : Version { public
          OneVersion(PhoneType phoneType) :base(phoneType) { } public override void
          Create() { Console.WriteLine("當(dāng)前版本1.0"); this._phoneType.SetType(); } } ///
          <summary> /// 當(dāng)前版本2.1 /// </summary> public class TwoVersion : Version { public
          TwoVersion(PhoneType phoneType) :base(phoneType) { } public override void
          Create() { Console.WriteLine("當(dāng)前版本2.0"); this._phoneType.SetType(); } }
          #endregion #region 具體實(shí)現(xiàn)化角色——具體實(shí)際使用類型=================== /// <summary> /// 安卓系統(tǒng)
          /// </summary> public class AndroidPhoneType : PhoneType { public override void
          SetType() { Console.WriteLine("當(dāng)前是Android類型"); } } /// <summary> /// ios系統(tǒng) ///
          </summary> public class IOSPhoneType : PhoneType { public override void
          SetType() { Console.WriteLine("當(dāng)前是IOS類型"); } } #endregion }
          ?
          class Program { static void Main(string[] args) { ///1.0版本軟件 安卓系統(tǒng)
          AndroidPhoneType androidPhoneType =new AndroidPhoneType(); OneVersion oneVersion
          =new OneVersion(androidPhoneType); oneVersion.Create(); ///2.0 版本軟件 IOS系統(tǒng)
          IOSPhoneType iOSPhoneType =new IOSPhoneType(); TwoVersion twoVersion = new
          TwoVersion(iOSPhoneType); twoVersion.Create(); Console.ReadLine(); } }
          ?

          使用場(chǎng)景及優(yōu)缺點(diǎn)

          一、使用場(chǎng)景

          1、如果系統(tǒng)需要在抽象化角色和實(shí)現(xiàn)化角色之間構(gòu)建增加一些靈活性,避免采用繼承類的形式??梢圆捎脴蚪幽J浇㈥P(guān)聯(lián)關(guān)系

          2、如果系統(tǒng)不希望采用繼承形式或者繼承形式會(huì)導(dǎo)致系統(tǒng)極為復(fù)雜,可以考慮采用橋接模式

          3、如果一個(gè)類存在兩個(gè)維度,且兩個(gè)維度都常變化擴(kuò)展,使用橋接模式再適合不過了

          二、優(yōu)點(diǎn)

          1、將抽象接口與實(shí)現(xiàn)解耦分離

          2、抽象與實(shí)現(xiàn)相互分離,易擴(kuò)展

          3、實(shí)現(xiàn)的細(xì)節(jié)對(duì)用戶透明

          三、缺點(diǎn)

          1、增加了系統(tǒng)的理解難度及設(shè)計(jì)難度

          總結(jié)


            橋接模式。意如其名。就是將一個(gè)類中兩個(gè)維度進(jìn)行分離開來。將抽象接口與實(shí)現(xiàn)解耦。然后通過組合橋接關(guān)聯(lián)在一起。組合使用。其兩個(gè)對(duì)象都是抽象,然后其子類具體實(shí)踐。由抽象接口對(duì)實(shí)現(xiàn)化角色的對(duì)象的引用來關(guān)聯(lián)。橋接模式適合用于兩個(gè)維度常變化的類。把多角度分離出來,然后讓他們獨(dú)立變化,減少耦合。

              ?天再高又怎樣,踮起腳尖就更接近陽(yáng)光。

          ?

              C#設(shè)計(jì)模式系列目錄 <https://www.cnblogs.com/hulizhong/p/11394686.html>

          歡迎大家掃描下方二維碼,和我一起踏上設(shè)計(jì)模式的闖關(guān)之路吧!

            

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                狠狠色噜噜噜 | 亚洲AV秘 无码一区二区三竹菊 | 波多野结衣在线天堂 | 秋霞丝鲁片一区二区三区手机在绒免 | 欧美少妇喷水 |