Java設(shè)計模式----橋接模式

場景

商城系統(tǒng)中常見的商品分類,以電腦為例,如何良好的處理商品分類銷售的問題?

  • 下圖的關(guān)系我們可以用多繼承結(jié)構(gòu)來實現(xiàn)


package bridge;

public interface Computer {
    void sale();
}

class Desktop implements Computer{
    public void sale() {
        System.out.println("銷售臺式機!");
    }
}

class Laptop implements Computer{
    public void sale() {
        System.out.println("銷售筆記本!");
    }
}

class Pad implements Computer{
    public void sale() {
        System.out.println("銷售平板!");
    }
}

class LenovoDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("銷售聯(lián)想臺式機!");
    }
}

class LenovoLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("銷售聯(lián)想筆記本!");
    }
}

class LenovoPad extends Pad{
    @Override
    public void sale() {
        System.out.println("銷售聯(lián)想平板!");
    }
}

class DellDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("銷售戴爾臺式機!");
    }
}

class DellLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("銷售戴爾筆記本!");
    }
}

class DellPad extends Pad{
    @Override
    public void sale() {
        System.out.println("銷售戴爾平板!");
    }
}

class HpDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("銷售惠普臺式機!");
    }
}

class HpLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("銷售惠普筆記本!");
    }
}

class HpPad extends Pad{
    @Override
    public void sale() {
        System.out.println("銷售惠普平板!");
    }
}

問題

  • 擴展性問題(類個數(shù)膨脹問題):
    如果要增加一個新的電腦類型:智能手機,則要增加各個品牌下面的類。
    如果要增加一個新的品牌,也要增加各種電腦類型的類。
  • 違反單一職責原則:
    一個類:比如聯(lián)想筆記本,有兩個引起這個類變化的原因(品牌和電腦類型)

場景分析

商城系統(tǒng)中常見的商品分類,以電腦為例,如何良好的處理商品分類銷售的問題?
這個場景中有兩個變化的維度:電腦類型劲藐、電腦品牌小腊。


橋接模式核心要點:

處理多繼承結(jié)構(gòu),處理多維度變化的場景,將各個維度設(shè)計成獨立的繼承結(jié)構(gòu),使各個維度可以獨立的擴展在抽象層建立關(guān)聯(lián)叠赦。


橋接模式
package bridge;

public interface Brand{
    void sale();
}

class Lenovo implements Brand{
    public void sale() {
        System.out.println("銷售聯(lián)想");
    }
}

class Dell implements Brand{
    public void sale() {
        System.out.println("銷售戴爾");
    }
}
package bridge;

public abstract class Computer2 {
    protected Brand brand;

    public Computer2(Brand brand) {
        this.brand = brand;
    }

    public abstract void sale();
}

class Desktop2 extends Computer2{

    public Desktop2(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        brand.sale();
        System.out.println("銷售臺式機");
    }
}

class Laptop2 extends Computer2{

    public Laptop2(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        brand.sale();
        System.out.println("銷售筆記本");
    }
}
package bridge;

public class Client {
    public static void main(String[] args) {
        Computer2 computer = new Laptop2(new Lenovo());
        computer.sale();
    }
}
輸出:
銷售聯(lián)想
銷售筆記本

橋接模式總結(jié)

  • 橋接模式可以取代多層繼承的方案马靠。多層繼承違背了單一職責原則篇梭,復(fù)用性較差赏表,類的個數(shù)也非常多检诗。橋接模式可以極大的減少子類的個數(shù),從而降低管理和維護的成本瓢剿。
  • 橋接模式極大的提高了系統(tǒng)可擴展性逢慌,在兩個變化維度中任意擴展一個維度,都不需要修改原有的系統(tǒng)间狂,符合開閉原則攻泼。
  • 雖然面向?qū)ο蟮睦^承,功能強大鉴象,但并不意味著只要可以用忙菠,我們就用上繼承,事實上很多情況下繼承會帶來麻煩纺弊。比如牛欢,對象的繼承關(guān)系是在編譯時就定義好了,所以無法在運行時改變從父類繼承的實現(xiàn)淆游。子類的實現(xiàn)與它的父類有非常緊密的依賴關(guān)系傍睹,以至于父類實現(xiàn)中的任何變化必然會導(dǎo)致子類發(fā)生變化。當你需要復(fù)用子類時稽犁,如果繼承下來的實現(xiàn)不適合解決新的問題焰望,則父類必然重寫或被其他更適合的類替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性已亥。
  • 合成/聚合復(fù)用原則熊赖,合成和聚合都是關(guān)聯(lián)的特殊種類。聚合表示一種弱的‘擁有’關(guān)系虑椎,體現(xiàn)的是A對象可以包含B對象震鹉,但B對象不是A對象的一部分俱笛;合成則是一種強的‘擁有’關(guān)系,體現(xiàn)了嚴格的部分和整體的關(guān)系传趾,部分和整體的生命周期一樣迎膜。
    合成/聚合復(fù)用原則的好處是,優(yōu)先使用對象的合成/聚合將有助于你保持每個類被封裝,并被集中在單個任務(wù)上。這樣類和類繼承層次會保持較小規(guī)模浆兰,并且不太可能增長為不可控制的龐然大物磕仅。(java編程思想在討論組合與繼承時,也建議慎用繼承簸呈,其使用場合僅限于你確信使用該技術(shù)確實有效的情況榕订。到底使用組合還是用繼承,一個最清晰的判斷方法就是問一問自己使用該技術(shù)是否需要從新類向基類進行向上轉(zhuǎn)型蜕便。如果必須向上轉(zhuǎn)型劫恒,則繼承是必要的;但如果不需要轿腺,則應(yīng)當好好考慮自己是否需要繼承两嘴。)

橋接模式實際開發(fā)中應(yīng)用場景

  • JDBC驅(qū)動程序
  • AWT中的Peer架構(gòu)
  • 銀行日志管理:
    格式分類:操作日志、交易日志族壳、異常日志
    距離分類:本地記錄日志憔辫、異地記錄日志
  • 人力資源系統(tǒng)中的獎金計算模塊:
    獎金分類:個人獎金、團體獎金决侈、激勵獎金
    部門分類:人事部門螺垢、銷售部門喧务、研發(fā)部門
  • OA系統(tǒng)中的消息處理:
    業(yè)務(wù)類型:普通消息赖歌、加急消息、特急消息
    發(fā)送消息方式:系統(tǒng)內(nèi)消息功茴、手機短信庐冯、郵件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坎穿,隨后出現(xiàn)的幾起案子展父,更是在濱河造成了極大的恐慌,老刑警劉巖玲昧,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栖茉,死亡現(xiàn)場離奇詭異,居然都是意外死亡孵延,警方通過查閱死者的電腦和手機吕漂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尘应,“玉大人惶凝,你說我怎么就攤上這事吼虎。” “怎么了苍鲜?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵思灰,是天一觀的道長。 經(jīng)常有香客問我混滔,道長洒疚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任坯屿,我火速辦了婚禮拳亿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愿伴。我一直安慰自己肺魁,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布隔节。 她就那樣靜靜地躺著鹅经,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怎诫。 梳的紋絲不亂的頭發(fā)上瘾晃,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天刁赦,我揣著相機與錄音烦却,去河邊找鬼。 笑死胚嘲,一個胖子當著我的面吹牛肉津,可吹牛的內(nèi)容都是我干的强胰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妹沙,長吁一口氣:“原來是場噩夢啊……” “哼偶洋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起距糖,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤玄窝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悍引,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩脂,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年趣斤,在試婚紗的時候發(fā)現(xiàn)自己被綠了俩块。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖典阵,靈堂內(nèi)的尸體忽然破棺而出奋渔,到底是詐尸還是另有隱情,我是刑警寧澤壮啊,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布嫉鲸,位于F島的核電站,受9級特大地震影響歹啼,放射性物質(zhì)發(fā)生泄漏玄渗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一狸眼、第九天 我趴在偏房一處隱蔽的房頂上張望藤树。 院中可真熱鬧,春花似錦拓萌、人聲如沸岁钓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屡限。三九已至,卻和暖如春炕倘,著一層夾襖步出監(jiān)牢的瞬間钧大,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工罩旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啊央,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓涨醋,卻偏偏與公主長得像瓜饥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子东帅,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • Java設(shè)計模式之橋接模式 回顧 上一期分享了適配器模式压固,主要為了實現(xiàn)解耦 橋接模式 簡介 橋接模式是對象的結(jié)構(gòu)模...
    icyage閱讀 196評論 0 0
  • 橋接模式就是創(chuàng)建一道橋梁來連接兩種類,一般都是對抽象和實現(xiàn)的橋接靠闭。對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類...
    留給時光吧閱讀 233評論 1 1
  • 參考資料:菜鳥教程之設(shè)計模式 設(shè)計模式概述 設(shè)計模式(Design pattern)代表了最佳的實踐,通常被有經(jīng)驗...
    Steven1997閱讀 1,174評論 1 12
  • 只喜歡畫畫坎炼。 我希望 能在心愛的白紙上畫畫 畫出笨拙的自由
    花生h閱讀 111評論 0 1
  • 從南到北愧膀, 由頭至尾, 騎在胯下谣光, 它是老馬檩淋, 不懂浮夸, 直奔天涯。 一個人蟀悦, 駕著車媚朦, 引著路, 綠草萋萋日戈, ...
    阿毛侃事閱讀 240評論 0 0