(五)設(shè)計模式之橋接模式

1. 意圖

將抽象部分與它的實現(xiàn)部分分離瓜喇,使它們都可以獨立地變化。

【GOF95】在提出橋梁模式的時候指出间聊,橋梁模式的用意是"將抽象化(Abstraction)與實現(xiàn)化(Implementation)脫耦吼鱼,使得二者可以獨立地變化"劫谅。這句話有三個關(guān)鍵詞,也就是抽象化粹污、實現(xiàn)化和脫耦段多。

  • 抽象化

存在于多個實體中的共同的概念性聯(lián)系,就是抽象化壮吩。作為一個過程进苍,抽象化就是忽略一些信息加缘,從而把不同的實體當做同樣的實體對待【LISKOV94】。

  • 實現(xiàn)化

抽象化給出的具體實現(xiàn)觉啊,就是實現(xiàn)化拣宏。

  • 脫耦

所謂耦合,就是兩個實體的行為的某種強關(guān)聯(lián)杠人。而將它們的強關(guān)聯(lián)去掉勋乾,就是耦合的解脫,或稱脫耦嗡善。在這里辑莫,脫耦是指將抽象化和實現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強關(guān)聯(lián)改換成弱關(guān)聯(lián)罩引。

將兩個角色之間的繼承關(guān)系改為聚合關(guān)系各吨,就是將它們之間的強關(guān)聯(lián)改換成為弱關(guān)聯(lián)。因此袁铐,橋梁模式中的所謂脫耦绅你,就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對獨立地變化昭躺。這就是橋梁模式的用意忌锯。

2. 結(jié)構(gòu)

橋梁模式所涉及的角色有:
抽象化(Abstraction)角色:抽象化給出的定義限书,并保存一個對實現(xiàn)化對象的引用便锨。
修正抽象化(Refined Abstraction)角色:擴展抽象化角色呵曹,改變和修正父類對抽象化的定義硝逢。
實現(xiàn)化(Implementor)角色:這個角色給出實現(xiàn)化角色的接口咏闪,但不給出具體的實現(xiàn)探孝。必須指出的是霍狰,這個接 口不一定和抽象化角色的接口定義相同葱峡,實際上,這兩個接口可以非常不一樣砰奕。實現(xiàn)化角色應(yīng)當只給出底層操作蛛芥,而抽象化角色應(yīng)當只給出基于底層操作的更高一層 的操作军援。
具體實現(xiàn)化(Concrete Implementor)角色:這個角色給出實現(xiàn)化角色接口的具體實現(xiàn)。

3. 例子

模擬游戲引擎的實現(xiàn)胸哥,假裝使用OpenGL和DirectX兩種引擎來繪制圖形


  1. 下圖為不使用設(shè)計模式時的代碼,當繪制的圖形需要擴展時或者需要擴展使用其它的引擎時,就會出現(xiàn)問題庐船,需要修改每個類的實現(xiàn)银酬,非常繁瑣,容易出錯筐钟。
using UnityEngine;

public class DM2Bridge : MonoBehaviour {

    void Start()
    {
        Sphere sphere=new Sphere();
        sphere.Draw();
        Cube cube = new Cube();
        cube.Draw();
    }
}

public class Sphere
{
    
    public string name = "Sphere";
    public OpenGL openGL = new OpenGL();
    public DirectX directX = new DirectX();

    public void Draw()
    {
        //openGL.Render(name);
        directX.Render(name);
    }
}

public class Cube
{
    
    public string name = "Cube";
    public OpenGL openGL = new OpenGL();
    public DirectX directX = new DirectX();

    public void Draw()
    {
        //openGL.Render(name);
        directX.Render(name);
    }
}
public class OpenGL
{
    public void Render(string name)
    {
        Debug.Log("OpenGL繪制出來了:" + name);
    }
}
public class DirectX
{
    public void Render(string name)
    {
        Debug.Log("DirectX繪制出來了:" + name);
    }
}
  1. 使用橋接模式揩瞪,經(jīng)過重構(gòu)之后提取出公有類,使用接口類來調(diào)用盗棵,當有新的需求時壮韭,只需更改調(diào)用即可
using UnityEngine;

public class DM2Bridge : MonoBehaviour {

    void Start()
    {
        IRenderEngine renderEngine=new OpenGL();

        Sphere sphere=new Sphere(renderEngine);
        sphere.Draw();
        Cube cube = new Cube(renderEngine);
        cube.Draw();
    }
}

public class IShape
{
    public string name;
    public IRenderEngine renderEngine;

    public IShape(IRenderEngine renderEngine)
    {
        this.renderEngine = renderEngine;
    }
    public void Draw()
    {
        renderEngine.Render(name);
    }
}

public abstract class IRenderEngine
{
    public abstract void Render(string name);
}
public class Sphere:IShape
{
    public Sphere(IRenderEngine re):base(re)
    {
        name = "Sphere";
    }
    public string name = "Sphere";
    public OpenGL openGL = new OpenGL();
    public DirectX directX = new DirectX();

    public void Draw()
    {
        openGL.Render(name);
        directX.Render(name);
    }
}

public class Cube:IShape
{
    public Cube(IRenderEngine re):base(re)
    {
        name = "Cube";
    }
    public string name = "Cube";
    public OpenGL openGL = new OpenGL();
    public DirectX directX = new DirectX();

    public void Draw()
    {
        openGL.Render(name);
        directX.Render(name);
    }
}
public class OpenGL:IRenderEngine
{
    public override void Render(string name)
    {
        Debug.Log("OpenGL繪制出來了:" + name);
    }
}
public class DirectX:IRenderEngine
{
    public override void Render(string name)
    {
        Debug.Log("DirectX繪制出來了:" + name);
    }
}

4. 橋接模式和適配器模式的區(qū)別

很多時候經(jīng)常容易把橋接模式和適配器模式弄混。那什么時候用橋接纹因,什么時候用適配器呢 喷屋?

共同點:
橋接和適配器都是讓兩個東西配合工作

不同點:出發(fā)點不同。
  適配器:改變已有的兩個接口瞭恰,讓他們相容屯曹。
  橋接模式:分離抽象化和實現(xiàn),使兩者的接口可以不同惊畏,目的是分離恶耽。

所以說,如果你拿到兩個已有模塊颜启,想讓他們同時工作偷俭,那么你使用的適配器。 如果你還什么都沒有缰盏,但是想分開實現(xiàn)涌萤,那么橋接是一個選擇。

橋接是先有橋口猜,才有兩端的東西 適配是先有兩邊的東西负溪,才有適配器 。
橋接是在橋好了之后济炎,兩邊的東西還可以變化川抡。

橋模式并不同于適配器模式,適配器模式其實是一個事后諸葛亮须尚,當發(fā)現(xiàn)以前的東西不適用了才去做一個彌補的措施崖堤。橋模式相對來說所做的改變比適配器模式早,它可以適用于有兩個甚至兩個以上維度的變化恨闪。

橋接模式將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系倘感,從而降低了類與類之間的耦合,減少了代碼編寫量咙咽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淤年,隨后出現(xiàn)的幾起案子钧敞,更是在濱河造成了極大的恐慌蜡豹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溉苛,死亡現(xiàn)場離奇詭異镜廉,居然都是意外死亡,警方通過查閱死者的電腦和手機愚战,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塔插,“玉大人拓哟,你說我怎么就攤上這事×魑疲” “怎么了违诗?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵诸迟,是天一觀的道長。 經(jīng)常有香客問我扣典,道長慎玖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任湿硝,我火速辦了婚禮关斜,結(jié)果婚禮上铺浇,老公的妹妹穿的比我還像新娘。我一直安慰自己丁稀,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布凿可。 她就那樣靜靜地躺著枯跑,像睡著了一般白热。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辜腺,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天评疗,我揣著相機與錄音茵烈,去河邊找鬼。 笑死呜投,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仑荐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼啥寇,長吁一口氣:“原來是場噩夢啊……” “哼辑甜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磷醋,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤邓线,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后褂痰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體症虑,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡谍憔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年习贫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苫昌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟身,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氯葬,到底是詐尸還是另有隱情婉陷,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布闯睹,位于F島的核電站担神,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏所刀。R本人自食惡果不足惜捞挥,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斩披。 院中可真熱鬧,春花似錦垦沉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棒仍,卻和暖如春臭胜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乱陡。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工吕晌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烙心。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓淫茵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匙瘪。 傳聞我的和親對象是個殘疾皇子蝶缀,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 發(fā)送提示消息## 考慮這樣一個實際的業(yè)務(wù)功能:發(fā)送提示消息翁都。基本上所有帶業(yè)務(wù)流程處理的系統(tǒng)...
    七寸知架構(gòu)閱讀 4,962評論 5 63
  • 設(shè)計模式匯總 一柄慰、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,903評論 1 15
  • 在正式介紹橋接模式之前敬矩,我先跟大家談?wù)剝煞N常見文具的區(qū)別,它們是毛筆和蠟筆蠢挡。假如我們需要大中小3種型號的畫筆袒哥,能夠...
    justCode_閱讀 1,764評論 0 7
  • 純粹是個人學習總結(jié)堡称,如有不對的地方請吐槽艺演。 設(shè)計模式參考地址:http://www.cnblogs.com/mao...
    junwu_123閱讀 642評論 0 0
  • 一伤提,無論是讀是作,學生不容找到實際的需求介汹。二,讀的方面嘹承,往往只注重思想的獲得而忽略語匯的擴展如庭,字句的修飾,篇章的組...
    May顧瑋瑋閱讀 332評論 2 0