通俗易懂設計模式解析——橋接模式


前言

  今天講解的是結構型設計模式中的第二種——橋接模式。橋接——是指依據OSI網絡模型鏈路層的地址,對網絡數據包進行轉發的過程,工作在OSI的第二層。一般的交換機網橋就有橋接作用。這是百科解釋。那么今天講的橋接模式是什么呢?橋接是一個紐帶,近年的港珠澳大橋。就充當起三地連接的紐帶。那么在設計模式中的橋接模式呢?也是一樣,其中組成也是通過橋接、紐帶連接。然后組合成所需要的東西的。我們具體看看其橋接模式的具體意義吧。

橋接模式介紹

一、來由

  在我們面對系統程序開發設計的時候,有時候會面臨着一些類會存在兩個維度的變化,在有多種可能會變化的情況下,用繼承會造成較為復雜的程序后果、擴展起來不那么靈活。那么如何去面對多個角度的分類並且多個角度都可能變化的情況呢?這就需要橋接模式了。

二、意圖

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

三、案例圖

 

 

 

四、橋接模式代碼示例

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

一、抽象化角色:抽象化給出定義,包含一個對實現化對象的引用

二、具體抽象化角色:擴展實現抽象化角色

三、實現化角色:這個角色給出實現化角色的接口,但不具體實現。這個 角色與抽象化角色不一定需要相同。相反可以完全不同。相當於抽象化 角色對應的是一個維度,而實現化角色對應的是第二個維度。
四、具體實現化角色:擴展實現實現化角色

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

   

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();
        }
    }

 

使用場景及優缺點

一、使用場景

1、如果系統需要在抽象化角色和實現化角色之間構建增加一些靈活性,避免采用繼承類的形式。可以采用橋接模式建立關聯關系

2、如果系統不希望采用繼承形式或者繼承形式會導致系統極為復雜,可以考慮采用橋接模式

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

二、優點

1、將抽象接口與實現解耦分離

2、抽象與實現相互分離,易擴展

3、實現的細節對用戶透明

三、缺點

1、增加了系統的理解難度及設計難度

總結

  橋接模式。意如其名。就是將一個類中兩個維度進行分離開來。將抽象接口與實現解耦。然后通過組合橋接關聯在一起。組合使用。其兩個對象都是抽象,然后其子類具體實踐。由抽象接口對實現化角色的對象的引用來關聯。橋接模式適合用於兩個維度常變化的類。把多角度分離出來,然后讓他們獨立變化,減少耦合。

     天再高又怎樣,踮起腳尖就更接近陽光。

 

    C#設計模式系列目錄

歡迎大家掃描下方二維碼,和我一起踏上設計模式的闖關之路吧!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM