Java設(shè)計(jì)模式之-橋接模式(Bridge)

在學(xué)習(xí)這個(gè)設(shè)計(jì)模式的時(shí)候儡嘶,我是比較痛苦的瞒爬。因?yàn)榫W(wǎng)上的很多教程雖然主題是橋(Bridge),但是一直在說如何拆分卑惜,如何解耦瘾带。直到我真正理解橋接模式之后妒蔚,才發(fā)現(xiàn)那些教程都背離了這一設(shè)計(jì)模式的名字---Bridge,即一個(gè)起到連接作用的物體月弛。

橋接的是什么肴盏?

試想有這樣一個(gè)類層次結(jié)構(gòu),它實(shí)現(xiàn)的是類的意義層面上的抽象:

類的意義抽象

另外還有一個(gè)接口層次結(jié)構(gòu)帽衙,而它表示的則是從類的行為層面進(jìn)行抽象:

類的行為抽象

為了讓兩者能夠松耦合地運(yùn)行在一起菜皂,通過在Shape中添加DrawingProgramming的實(shí)例的方式進(jìn)行聚合,即實(shí)現(xiàn)了橋接模式:


橋接兩個(gè)抽象

橋接模式

一般來說厉萝,橋接模式可以概括為下圖:


橋接模式示意圖

可以看到圖中共有5個(gè)主要的概念:

  1. Client: 客戶端恍飘,對類進(jìn)行調(diào)用;
  2. Abstraction:抽象類谴垫,從類的實(shí)際含義角度出發(fā)章母,對其進(jìn)行抽象,并包含一個(gè)Implementor的實(shí)例
  3. Implementor:實(shí)現(xiàn)者翩剪,一般是一個(gè)定義了類的各種行為的接口乳怎;
  4. RefinedAbstraction:細(xì)化類,擴(kuò)展(extends)了Abstraction前弯,從類的含義上進(jìn)行結(jié)構(gòu)的堆疊蚪缀;
  5. ConcreteImplementor A&B:具體實(shí)現(xiàn),即實(shí)現(xiàn)了Implementor中定義的方法恕出,提供類的行為的具體內(nèi)容询枚。

其實(shí)看到這個(gè)圖之后,有的人可能會提出異議:

為什么不直接將Implementor中定義的方法放入Abstraction浙巫,然后讓RefinedAbstraction直接實(shí)現(xiàn)呢金蜀?

單一責(zé)任原則

單一責(zé)任原則(SRP:Single responsibility principle)又稱單一職責(zé)原則刷后,如果一個(gè)類承擔(dān)的責(zé)任過多,就等于把這些責(zé)任耦合在一起了渊抄。一個(gè)責(zé)任的變化可能會影響這個(gè)類完成其他責(zé)任的能力惠险。這種耦合會導(dǎo)致脆弱的設(shè)計(jì),當(dāng)發(fā)生變更時(shí)抒线,設(shè)計(jì)會遭受到意想不到的破壞班巩。

SRP正是橋接模式要維護(hù)的原則。試問如果真的將方法放入Abstraction后嘶炭,它的子類將會為了實(shí)現(xiàn)放入父類的方法而絞盡腦汁抱慌,盡管很可能某個(gè)方法和某個(gè)子類沒有任何關(guān)系;而如果不把大部分子類的行為方法抽象到父類中眨猎,又會導(dǎo)致類型之間的不兼容抑进,引發(fā)了大量的instanceof海洋(instance of ocean)。

子類耦合泛濫

橋接模式的優(yōu)點(diǎn)

使用橋接模式睡陪,主要是看中了它所帶來的優(yōu)點(diǎn):

  1. 將類的含義層次和行為層次松耦合寺渗;
  2. 使整套API能夠擁有兩個(gè)維度的擴(kuò)展鏈,提到了系統(tǒng)的獨(dú)立性兰迫;
  3. 隱藏了更多的細(xì)節(jié)信殊;
  4. 使用設(shè)計(jì)模式能夠使其他開發(fā)維護(hù)者更容易理解。

使用范例

從下圖中我們可以看出汁果,Shape和DrawAPI很好地解耦了涡拘,Circle從類的含義出發(fā)進(jìn)行了擴(kuò)展,而RedCircle和GreenCircle從類的行為出發(fā)進(jìn)行了接口的實(shí)現(xiàn)据德,兩者互不影響鳄乏,且通過一個(gè)聚合的關(guān)系,將兩個(gè)維度松耦合到了一起棘利。


橋接的使用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橱野,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子善玫,更是在濱河造成了極大的恐慌水援,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌焚,死亡現(xiàn)場離奇詭異裹唆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)只洒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳坑,“玉大人毕谴,你說我怎么就攤上這事。” “怎么了涝开?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵循帐,是天一觀的道長。 經(jīng)常有香客問我舀武,道長拄养,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任银舱,我火速辦了婚禮瘪匿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寻馏。我一直安慰自己棋弥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布诚欠。 她就那樣靜靜地躺著顽染,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轰绵。 梳的紋絲不亂的頭發(fā)上粉寞,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音左腔,去河邊找鬼仁锯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翔悠,可吹牛的內(nèi)容都是我干的业崖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蓄愁,長吁一口氣:“原來是場噩夢啊……” “哼双炕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撮抓,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妇斤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后丹拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站超,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年乖酬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了死相。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咬像,死狀恐怖算撮,靈堂內(nèi)的尸體忽然破棺而出生宛,到底是詐尸還是另有隱情,我是刑警寧澤肮柜,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布陷舅,位于F島的核電站,受9級特大地震影響审洞,放射性物質(zhì)發(fā)生泄漏莱睁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一芒澜、第九天 我趴在偏房一處隱蔽的房頂上張望仰剿。 院中可真熱鬧,春花似錦撰糠、人聲如沸酥馍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨袒。三九已至,卻和暖如春术辐,著一層夾襖步出監(jiān)牢的瞬間砚尽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工辉词, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留必孤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓瑞躺,卻偏偏與公主長得像敷搪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子幢哨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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

  • 1 場景問題# 1.1 發(fā)送提示消息## 考慮這樣一個(gè)實(shí)際的業(yè)務(wù)功能:發(fā)送提示消息赡勘。基本上所有帶業(yè)務(wù)流程處理的系統(tǒng)...
    七寸知架構(gòu)閱讀 5,017評論 5 63
  • 設(shè)計(jì)模式匯總 一捞镰、基礎(chǔ)知識 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用闸与、多...
    MinoyJet閱讀 3,948評論 1 15
  • Iterator模式 (迭代器) 一個(gè)一個(gè)遍歷 一個(gè)集合類可以遵守 Iterator 協(xié)議,并實(shí)現(xiàn)一個(gè) Itera...
    SSBun閱讀 1,847評論 0 15
  • 在正式介紹橋接模式之前岸售,我先跟大家談?wù)剝煞N常見文具的區(qū)別践樱,它們是毛筆和蠟筆。假如我們需要大中小3種型號的畫筆凸丸,能夠...
    justCode_閱讀 1,772評論 0 7
  • 開始工作的第一個(gè)月起就將我的收入的10%捐給教堂額拷邢,或者是捐給一些其他需要幫助的人,這是一個(gè)秘訣甲雅。嗯解孙,像蔡總每年都...
    小二燙壺酒閱讀 244評論 0 0