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è)圖之后,有的人可能會(huì)提出異議:

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

單一責(zé)任原則

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

SRP正是橋接模式要維護(hù)的原則。試問如果真的將方法放入Abstraction后,它的子類將會(huì)為了實(shí)現(xiàn)放入父類的方法而絞盡腦汁,盡管很可能某個(gè)方法和某個(gè)子類沒有任何關(guān)系;而如果不把大部分子類的行為方法抽象到父類中,又會(huì)導(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容