橋接模式

轉(zhuǎn):http://www.runoob.com/design-pattern/bridge-pattern.html

橋接模式

橋接(Bridge)是用于把抽象化與實(shí)現(xiàn)化解耦誓篱,使得二者可以獨(dú)立變化。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu)很澄,來實(shí)現(xiàn)二者的解耦缴守。

這種模式涉及到一個(gè)作為橋接的接口沾凄,使得實(shí)體類的功能獨(dú)立于接口實(shí)現(xiàn)類喜滨。這兩種類型的類可被結(jié)構(gòu)化改變而互不影響焚廊。

我們通過下面的實(shí)例來演示橋接模式(Bridge Pattern)的用法冶匹。其中,可以使用相同的抽象類方法但是不同的橋接實(shí)現(xiàn)類咆瘟,來畫出不同顏色的圓嚼隘。

介紹

意圖:將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化袒餐。

主要解決:在有多種可能會(huì)變化的情況下飞蛹,用繼承會(huì)造成類爆炸問題,擴(kuò)展起來不靈活灸眼。

何時(shí)使用:實(shí)現(xiàn)系統(tǒng)可能有多個(gè)角度分類卧檐,每一種角度都可能變化。

如何解決:把這種多角度分類分離出來焰宣,讓它們獨(dú)立變化霉囚,減少它們之間耦合。

關(guān)鍵代碼:抽象類依賴實(shí)現(xiàn)類匕积。

應(yīng)用實(shí)例:?1盈罐、豬八戒從天蓬元帥轉(zhuǎn)世投胎到豬,轉(zhuǎn)世投胎的機(jī)制將塵世劃分為兩個(gè)等級(jí)闪唆,即:靈魂和肉體盅粪,前者相當(dāng)于抽象化,后者相當(dāng)于實(shí)現(xiàn)化悄蕾。生靈通過功能的委派票顾,調(diào)用肉體對象的功能,使得生靈可以動(dòng)態(tài)地選擇笼吟。 2库物、墻上的開關(guān)霸旗,可以看到的開關(guān)是抽象的贷帮,不用管里面具體怎么實(shí)現(xiàn)的。

優(yōu)點(diǎn):?1诱告、抽象和實(shí)現(xiàn)的分離撵枢。 2民晒、優(yōu)秀的擴(kuò)展能力。 3锄禽、實(shí)現(xiàn)細(xì)節(jié)對客戶透明潜必。

缺點(diǎn):橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層沃但,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)與編程磁滚。

使用場景:?1、如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性宵晚,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系垂攘,通過橋接模式可以使它們在抽象層建立一個(gè)關(guān)聯(lián)關(guān)系。 2淤刃、對于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng)晒他,橋接模式尤為適用。 3逸贾、一個(gè)類存在兩個(gè)獨(dú)立變化的維度陨仅,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展。

注意事項(xiàng):對于兩個(gè)獨(dú)立變化的維度铝侵,使用橋接模式再適合不過了灼伤。

實(shí)現(xiàn)

我們有一個(gè)作為橋接實(shí)現(xiàn)的?DrawAPI?接口和實(shí)現(xiàn)了?DrawAPI?接口的實(shí)體類?RedCircleGreenCircle咪鲜。Shape?是一個(gè)抽象類饺蔑,將使用?DrawAPI?的對象。BridgePatternDemo嗜诀,我們的演示類使用?Shape?類來畫出不同顏色的圓猾警。

步驟 1

創(chuàng)建橋接實(shí)現(xiàn)接口。

DrawAPI.java

public interface DrawAPI {? public void drawCircle(int radius, int x, int y);}

步驟 2

創(chuàng)建實(shí)現(xiàn)了?DrawAPI?接口的實(shí)體橋接實(shí)現(xiàn)類隆敢。

RedCircle.java

public class RedCircle implements DrawAPI {? @Override? public void drawCircle(int radius, int x, int y) {? ? ? System.out.println("Drawing Circle[ color: red, radius: "? ? ? ? + radius +", x: " +x+", "+ y +"]");

? }}

GreenCircle.java

public class GreenCircle implements DrawAPI {? @Override? public void drawCircle(int radius, int x, int y) {? ? ? System.out.println("Drawing Circle[ color: green, radius: "? ? ? ? + radius +", x: " +x+", "+ y +"]");

? }}

步驟 3

使用?DrawAPI?接口創(chuàng)建抽象類?Shape发皿。

Shape.java

public abstract class Shape {? protected DrawAPI drawAPI;

? protected Shape(DrawAPI drawAPI){? ? ? this.drawAPI = drawAPI;

? }? public abstract void draw();? }

步驟 4

創(chuàng)建實(shí)現(xiàn)了?Shape?接口的實(shí)體類。

Circle.java

public class Circle extends Shape {? private int x, y, radius;

? public Circle(int x, int y, int radius, DrawAPI drawAPI) {? ? ? super(drawAPI);

? ? ? this.x = x;?

? ? ? this.y = y;?

? ? ? this.radius = radius;

? }

? public void draw() {? ? ? drawAPI.drawCircle(radius,x,y);

? }}

步驟 5

使用?Shape?和?DrawAPI?類畫出不同顏色的圓拂蝎。

BridgePatternDemo.java

public class BridgePatternDemo {? public static void main(String[] args) {? ? ? Shape redCircle = new Circle(100,100, 10, new RedCircle());

? ? ? Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

? ? ? redCircle.draw();

? ? ? greenCircle.draw();

? }}

步驟 6

執(zhí)行程序穴墅,輸出結(jié)果:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市温自,隨后出現(xiàn)的幾起案子玄货,更是在濱河造成了極大的恐慌,老刑警劉巖悼泌,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件松捉,死亡現(xiàn)場離奇詭異,居然都是意外死亡馆里,警方通過查閱死者的電腦和手機(jī)隘世,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門可柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丙者,你說我怎么就攤上這事复斥。” “怎么了械媒?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵目锭,是天一觀的道長。 經(jīng)常有香客問我纷捞,道長侣集,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任兰绣,我火速辦了婚禮世分,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缀辩。我一直安慰自己臭埋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布臀玄。 她就那樣靜靜地躺著瓢阴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪健无。 梳的紋絲不亂的頭發(fā)上荣恐,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音累贤,去河邊找鬼叠穆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臼膏,可吹牛的內(nèi)容都是我干的硼被。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼渗磅,長吁一口氣:“原來是場噩夢啊……” “哼嚷硫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起始鱼,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仔掸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后医清,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體起暮,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年状勤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鞋怀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双泪。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡持搜,死狀恐怖密似,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葫盼,我是刑警寧澤残腌,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站贫导,受9級(jí)特大地震影響抛猫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孩灯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一闺金、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峰档,春花似錦败匹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欢顷,卻和暖如春槽棍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抬驴。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工炼七, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人布持。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓特石,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳖链。 傳聞我的和親對象是個(gè)殘疾皇子姆蘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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

  • 1 場景問題# 1.1 發(fā)送提示消息## 考慮這樣一個(gè)實(shí)際的業(yè)務(wù)功能:發(fā)送提示消息≤轿基本上所有帶業(yè)務(wù)流程處理的系統(tǒng)...
    七寸知架構(gòu)閱讀 4,966評論 5 63
  • 橋接模式 在開始學(xué)java的時(shí)候老師講到繼承的時(shí)候逞敷,總是喜歡用一個(gè)例子來講解,那就是畫圖灌侣,這里有一個(gè)畫筆推捐,可以畫正...
    han2019閱讀 778評論 0 0
  • 1.初識(shí)橋接模式 將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化侧啼。 Abstraction:抽象部分的接口牛柒。...
    王偵閱讀 903評論 0 7
  • C語言版本的hello world
    寫史官閱讀 58評論 0 0
  • 之前公司的測試環(huán)境堪簿,剛開始自己搭建虛擬機(jī),然后安裝redis皮壁,nginx椭更,mq,mysql,tomcat,jdk,...
    zhuyuansj閱讀 15,481評論 3 1