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

前言

橋接模式又稱橋梁模式厉熟,屬于結(jié)構(gòu)型模式抹估,是指將抽象化實(shí)現(xiàn)化 脫耦廉丽,使得二者可以獨(dú)立的變化倦微。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度正压。

定義

將抽象和行為劃分開來欣福,各自獨(dú)立,但能動(dòng)態(tài)的結(jié)合

結(jié)構(gòu)

橋接(Bridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :定義抽象類焦履,并包含一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用拓劝。
  • 擴(kuò)展抽象化(Refined Abstraction)角色 :是抽象化角色的子類,實(shí)現(xiàn)父類中的業(yè)務(wù)方法嘉裤,并通過組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法郑临。
  • 實(shí)現(xiàn)化(Implementor)角色 :定義實(shí)現(xiàn)化角色的接口,供擴(kuò)展抽象化角色調(diào)用屑宠。
  • 具體實(shí)現(xiàn)化(Concrete Implementor)角色 :給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)厢洞。
為什么使用

通常,當(dāng)一個(gè)抽象類或接口有多個(gè)具體實(shí)現(xiàn)(concrete subclass),這些concrete之間關(guān)系可能有以下兩種:

  • 這多個(gè)具體實(shí)現(xiàn)之間恰好是并列的,沒有概念上的重復(fù)躺翻,那么我們只要使用繼承就可以了
  • 實(shí)際應(yīng)用上丧叽,常常有可能在這多個(gè)concrete class之間有概念上重疊,那么需要我們把抽象共同部分和行為共同部門各自獨(dú)立開來公你,原來是準(zhǔn)備放在一個(gè)接口里踊淳,現(xiàn)在需要設(shè)計(jì)兩個(gè)接口,分別放置抽象和行為省店。
如何實(shí)現(xiàn)

【例】視頻播放器
需要開發(fā)一個(gè)跨平臺(tái)視頻播放器嚣崭,可以在不同操作系統(tǒng)平臺(tái)(如Windows、Mac懦傍、Linux等)上播放多種格式的視頻文件雹舀,常見的視頻格式包括RMVB、AVI粗俱、WMV等说榆。該播放器包含了兩個(gè)維度,適合使用橋接模式寸认。
類圖如下:


橋接模式.png

代碼如下:

//視頻文件
public interface VideoFile {
 void decode(String fileName);
}

//avi文件
public class AVIFile implements VideoFile {
 public void decode(String fileName) {
 System.out.println("avi視頻文件:"+ fileName);
 }
}

//rmvb文件
public class REVBBFile implements VideoFile {

 public void decode(String fileName) {
 System.out.println("rmvb文件:" + fileName);
 }
}

//操作系統(tǒng)版本
public abstract class OperatingSystemVersion {

 protected VideoFile videoFile;

 public OperatingSystemVersion(VideoFile videoFile) {
 this.videoFile = videoFile;
 }

 public abstract void play(String fileName);
}

//Windows版本
public class Windows extends OperatingSystem {

 public Windows(VideoFile videoFile) {
 super(videoFile);
 }

 public void play(String fileName) {
 videoFile.decode(fileName);
 }
}

//mac版本
public class Mac extends OperatingSystemVersion {

 public Mac(VideoFile videoFile) {
 super(videoFile);
 }

 public void play(String fileName) {
 videoFile.decode(fileName);
 }
}

//測(cè)試類
public class Client {
 public static void main(String[] args) {
 OperatingSystem os = new Windows(new AVIFile());
 os.play("戰(zhàn)狼3");
 }
}

好處:

  • 橋接模式提高了系統(tǒng)的可擴(kuò)充性签财,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度,都不需要修改原有系統(tǒng)偏塞。
    如:如果現(xiàn)在還有一種視頻文件類型wmv唱蒸,我們只需要再定義一個(gè)類實(shí)現(xiàn)VideoFile接口即可,其他類不需要發(fā)生變化灸叼。
  • 實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明
使用場(chǎng)景
  • 當(dāng)一個(gè)類存在兩個(gè)獨(dú)立變化的維度神汹,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展時(shí)。
  • 當(dāng)一個(gè)系統(tǒng)不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加時(shí)古今。
  • 當(dāng)一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性時(shí)屁魏。避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系捉腥。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氓拼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抵碟,更是在濱河造成了極大的恐慌桃漾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立磁,死亡現(xiàn)場(chǎng)離奇詭異呈队,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唱歧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宪摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒竖,“玉大人,你說我怎么就攤上這事几于∪锩纾” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沿彭,是天一觀的道長(zhǎng)朽砰。 經(jīng)常有香客問我,道長(zhǎng)喉刘,這世上最難降的妖魔是什么瞧柔? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮睦裳,結(jié)果婚禮上造锅,老公的妹妹穿的比我還像新娘。我一直安慰自己廉邑,他們只是感情好哥蔚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛛蒙,像睡著了一般糙箍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牵祟,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天深夯,我揣著相機(jī)與錄音,去河邊找鬼诺苹。 笑死塌西,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筝尾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼办桨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筹淫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呢撞,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤损姜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后殊霞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摧阅,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年绷蹲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棒卷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾孽。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖比规,靈堂內(nèi)的尸體忽然破棺而出若厚,到底是詐尸還是另有隱情,我是刑警寧澤蜒什,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布测秸,位于F島的核電站,受9級(jí)特大地震影響灾常,放射性物質(zhì)發(fā)生泄漏霎冯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一钞瀑、第九天 我趴在偏房一處隱蔽的房頂上張望沈撞。 院中可真熱鬧,春花似錦仔戈、人聲如沸关串。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晋修。三九已至,卻和暖如春凰盔,著一層夾襖步出監(jiān)牢的瞬間墓卦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工户敬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留落剪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓尿庐,卻偏偏與公主長(zhǎng)得像忠怖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抄瑟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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