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

模式的定義

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

模式的使用場(chǎng)景

如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間添加更多的靈活性么夫,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系。設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端吧享,或者實(shí)現(xiàn)化角色的改變對(duì)客戶端是完全透明的魏割。需要跨越多個(gè)平臺(tái)的圖形和窗口系統(tǒng)上。一個(gè)類存在兩個(gè)獨(dú)立變化的維度钢颂,且兩個(gè)維度都需要進(jìn)行擴(kuò)展钞它。

UML類圖

角色介紹

抽象化(Abstraction)角色:抽象化給出的定義,并保存一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用殊鞭。 修正抽象化(Refined Abstraction)角色:擴(kuò)展抽象化角色遭垛,改變和修正父類對(duì)抽象化的定義。實(shí)現(xiàn)化(Implementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色的接口操灿,但不給出具體的實(shí)現(xiàn)锯仪。必須指出的是,這個(gè)接 口不一定和抽象化角色的接口定義相同趾盐,實(shí)際上庶喜,這兩個(gè)接口可以非常不一樣。實(shí)現(xiàn)化角色應(yīng)當(dāng)只給出底層操作救鲤,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作久窟。具體實(shí)現(xiàn)化(ConcreteImplementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。

模式的簡(jiǎn)單實(shí)現(xiàn)

  • 介紹

其實(shí)Java的虛擬機(jī)就是一個(gè)很好的例子本缠,在不同平臺(tái)平臺(tái)上斥扛,用不同的虛擬機(jī)進(jìn)行實(shí)現(xiàn),這樣只需把Java程序編譯成符合虛擬機(jī)規(guī)范的文件丹锹,且只用編譯一次稀颁,便在不同平臺(tái)上都能工作芬失。 但是這樣說(shuō)比較抽象,用一個(gè)簡(jiǎn)單的例子來(lái)實(shí)現(xiàn)bridge模式匾灶。

編寫(xiě)一個(gè)程序棱烂,使用兩個(gè)繪圖的程序的其中一個(gè)來(lái)繪制矩形或者原型,同時(shí)粘昨,在實(shí)例化矩形的時(shí)候垢啼,它要知道使用繪圖程序1(DP1)還是繪圖程序2(DP2)窜锯。

(ps:假設(shè)dp1和dp2的繪制方式不一樣张肾,它們是用不同方式進(jìn)行繪制,示例代碼锚扎,不討論過(guò)多細(xì)節(jié))

  • 實(shí)現(xiàn)源碼
首先是兩個(gè)繪圖程序dp1,dp2
//具體的繪圖程序類dp1
public class DP1 {
    public void draw_1_Rantanle(){
        System.out.println("使用DP1的程序畫(huà)矩形");
    }
    public void draw_1_Circle(){
        System.out.println("使用DP1的程序畫(huà)圓形");
    }
}
//具體的繪圖程序類dp2
public class DP2 {
    public void drawRantanle(){
        System.out.println("使用DP2的程序畫(huà)矩形");
    }
    public void drawCircle(){
        System.out.println("使用DP2的程序畫(huà)圓形");
    }
}
接著?抽象的形狀Shape和兩個(gè)派生類:矩形Rantanle和圓形Circle
//抽象化角色Abstraction
abstract class Shape {
    //持有實(shí)現(xiàn)的角色I(xiàn)mplementor(作圖類)
    protected Drawing myDrawing;
    public Shape(Drawing drawing) {
        this.myDrawing = drawing;
    }
    abstract public void draw();
    //保護(hù)方法drawRectangle
    protected void drawRectangle(){
       //this.impl.implmentation()
        myDrawing.drawRantangle();
    }
    //保護(hù)方法drawCircle
    protected void drawCircle(){
        //this.impl.implmentation()
        myDrawing.drawCircle();
    }
}
//修正抽象化角色Refined Abstraction(矩形)
public class Rantangle extends Shape{
    public Rantangle(Drawing drawing) {
        super(drawing);
    }
    @Override
    public void draw() {
        drawRectangle();
    }
}
//修正抽象化角色Refined Abstraction(圓形)
public class Circle extends Shape {
    public Circle(Drawing drawing) {
        super(drawing);
    }
    @Override
    public void draw() {
        drawCircle();
    }
}
最后吞瞪,我們的實(shí)現(xiàn)繪圖的Drawing和分別實(shí)現(xiàn)dp1的V1Drawing和dp2的V2Drawing
//實(shí)現(xiàn)化角色I(xiàn)mplementor
//implmentation兩個(gè)方法,畫(huà)圓和畫(huà)矩形
public interface Drawing {
    public void drawRantangle();
    public void drawCircle();
}
//具體實(shí)現(xiàn)化邏輯ConcreteImplementor
//實(shí)現(xiàn)了接口方法驾孔,使用DP1進(jìn)行繪圖
public class V1Drawing implements Drawing{
    DP1 dp1;
    public V1Drawing() {
        dp1 = new DP1();
    }
    @Override
    public void drawRantangle() {
        dp1.draw_1_Rantanle();
    }
    @Override
    public void drawCircle() {
        dp1.draw_1_Circle();
    }           
}
//具體實(shí)現(xiàn)化邏輯ConcreteImplementor
//實(shí)現(xiàn)了接口方法芍秆,使用DP2進(jìn)行繪圖
public class V2Drawing implements Drawing{
    DP2 dp2;
    public V2Drawing() {
        dp2 = new DP2();
    }
    @Override
    public void drawRantangle() {
        dp2.drawRantanle();
    }
    @Override
    public void drawCircle() {
        dp2.drawCircle();
    }
}

在這個(gè)示例中,圖形Shape類有兩種類型翠勉,圓形和矩形妖啥,為了使用不同的繪圖程序繪制圖形,把實(shí)現(xiàn)的部分進(jìn)行了分離对碌,構(gòu)成了Drawing類層次結(jié)構(gòu)荆虱,包括V1Drawing和V2Drawing。在具體實(shí)現(xiàn)類中朽们,V1Drawing控制著DP1程序進(jìn)行繪圖怀读,V2Drawing控制著DP2程序進(jìn)行繪圖,以及保護(hù)的方法drawRantangle,drawCircle(Shape類中) 骑脱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菜枷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叁丧,更是在濱河造成了極大的恐慌啤誊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拥娄,死亡現(xiàn)場(chǎng)離奇詭異蚊锹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)条舔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門枫耳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人孟抗,你說(shuō)我怎么就攤上這事迁杨∽晷模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵铅协,是天一觀的道長(zhǎng)捷沸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狐史,這世上最難降的妖魔是什么痒给? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮骏全,結(jié)果婚禮上苍柏,老公的妹妹穿的比我還像新娘。我一直安慰自己姜贡,他們只是感情好试吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著楼咳,像睡著了一般熄捍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上母怜,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天余耽,我揣著相機(jī)與錄音,去河邊找鬼苹熏。 笑死碟贾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柜裸。 我是一名探鬼主播缕陕,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疙挺!你這毒婦竟也來(lái)了扛邑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铐然,失蹤者是張志新(化名)和其女友劉穎蔬崩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搀暑,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沥阳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了自点。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桐罕。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出功炮,到底是詐尸還是另有隱情溅潜,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布薪伏,位于F島的核電站滚澜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫁怀。R本人自食惡果不足惜设捐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塘淑。 院中可真熱鬧萝招,春花似錦、人聲如沸朴爬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)召噩。三九已至,卻和暖如春逸爵,著一層夾襖步出監(jiān)牢的瞬間具滴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工师倔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留构韵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓趋艘,卻偏偏與公主長(zhǎng)得像疲恢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓷胧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • Java設(shè)計(jì)模式之橋接模式 回顧 上一期分享了適配器模式显拳,主要為了實(shí)現(xiàn)解耦 橋接模式 簡(jiǎn)介 橋接模式是對(duì)象的結(jié)構(gòu)模...
    icyage閱讀 196評(píng)論 0 0
  • Java設(shè)計(jì)模式<橋接模式> 意圖 橋接模式就是把事物和其具體實(shí)現(xiàn)分開(kāi),使他們可以各自獨(dú)立的變化搓萧。橋接的用意是:將...
    熬夜的貓頭鷹閱讀 246評(píng)論 0 1
  • 場(chǎng)景 商城系統(tǒng)中常見(jiàn)的商品分類,以電腦為例,如何良好的處理商品分類銷售的問(wèn)題? 下圖的關(guān)系我們可以用多繼承結(jié)構(gòu)來(lái)實(shí)...
    GaaraZ閱讀 689評(píng)論 0 1
  • 橋接模式就是創(chuàng)建一道橋梁來(lái)連接兩種類杂数,一般都是對(duì)抽象和實(shí)現(xiàn)的橋接。對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類...
    留給時(shí)光吧閱讀 233評(píng)論 1 1
  • This is a tool that can repair your vision. The training ...
    Madelines閱讀 241評(píng)論 0 0