前言
今天講解的是結(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)之路吧!
熱門工具 換一換