圖解Java設(shè)計模式之橋接模式

@TOC

手機操作問題

現(xiàn)在對不同手機類型的不同品牌實現(xiàn)操作編程(比如 :開機冯键、關(guān)機惫确、上網(wǎng)蚯舱、打電話等等)晓淀,如圖 :


在這里插入圖片描述

傳統(tǒng)方案解決手機操作問題

傳統(tǒng)方法對應(yīng)的類圖


在這里插入圖片描述

傳統(tǒng)方案解決手機操作問題分析

1)擴展性問題(類爆炸)凶掰,如果我們再增加手機的樣式(旋轉(zhuǎn)式),就需要增加各個品牌手機的類稚配,同樣如果我們增加一個手機品牌港华,也要在各個手機樣式類下增加立宜。
2)違反類單一職責(zé)原則,當(dāng)我們增加手機樣式時尊流,要同時增加所有品牌的手機灯帮,這樣增加類代碼維護成本钟哥。
3)解決方案 - 使用橋接模式

橋接模式(Bridge)-基本介紹

1)橋接模式(Bridge 模式)是指 : 將實現(xiàn)與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變忿晕。
2)是一種結(jié)構(gòu)型設(shè)計模式
3)Bridge模式基于類的最小設(shè)計原則践盼,通過使用封裝宾巍、聚合及繼承等行為讓不同的類承擔(dān)不同的職責(zé)顶霞。它的主要特點是把抽象(Abstraction)與行為實現(xiàn)(Implementation)分離開來,從而可以保持各部分的獨立性以及應(yīng)對他們的功能擴展蓝厌。


在這里插入圖片描述

說明 :
1)Client類 :橋接模式的調(diào)用者拓提。
2)抽象類(Abstraction) :維護了Implementor / 即它的實現(xiàn)類ConcreteImplementorA..代态,二者是聚合關(guān)系,Abstraction充當(dāng)橋接類西雀。
3)RefinedAbstraction :是Abstraction抽象類的子類歉摧。
4)Implementor :行為實現(xiàn)類的接口
5)ConcreteImplementor A/ B : 行為的具體實現(xiàn)類
6)從UML圖 :這里的抽象類和接口是聚合的關(guān)系叁温,其實調(diào)用和被調(diào)用關(guān)系

橋接模式解決手機操作問題

使用橋接模式改進傳統(tǒng)方式券盅,讓程序具有很好的擴展性膛檀,利用程序維護
1)應(yīng)用實例和前面一樣
2)使用橋接模式對應(yīng)的類圖


在這里插入圖片描述
package com.example.demo.bridge;

/**
 * 接口
 * @author zhaozhaohai
 *
 */
public interface Brand {

    void open();
    void close();
    void call();
}
package com.example.demo.bridge;

public class Vivo implements Brand{

    @Override
    public void open() {
        // TODO Auto-generated method stub
        System.out.println("Vivo手機開機");
    }

    @Override
    public void close() {
        // TODO Auto-generated method stub
        System.out.println("Vivo手機關(guān)機");
    }

    @Override
    public void call() {
        // TODO Auto-generated method stub
        System.out.println("Vivo手機打電話");
    }

}
package com.example.demo.bridge;

public class XiaoMi implements Brand{

    @Override
    public void open() {
        // TODO Auto-generated method stub
        System.out.println("小米手機開機");
    }

    @Override
    public void close() {
        // TODO Auto-generated method stub
        System.out.println("小米手機關(guān)機");
    }

    @Override
    public void call() {
        // TODO Auto-generated method stub
        System.out.println("小米手機打電話");
    }

}
package com.example.demo.bridge;

public abstract class Phone {

    /**
     * 組合品牌
     */
    private Brand brand;
    
    public Phone(Brand brand) {
        this.brand = brand;
    }
    
    protected void open() {
        this.brand.open();
    }
    
    protected void close() {
        this.brand.close();
    }
    
    protected void call() {
        this.brand.call();
    }
}
package com.example.demo.bridge;

/**
 * 折疊式手機類泳炉,繼承抽象類Phone
 * @author zhaozhaohai
 *
 */
public class FoldedPhone extends Phone{

    public FoldedPhone(Brand brand) {
        super(brand);
        // TODO Auto-generated constructor stub
    }
    public void open() {
        super.open();
        System.out.println(" 折疊樣式手機 ");
    }
    
    public void close() {
        super.close();
        System.out.println(" 折疊樣式手機 ");
    }
    
    public void cell() {
        super.call();
        System.out.println(" 折疊樣式手機 ");
    }
}
package com.example.demo.bridge;

public class UpRightPhone extends Phone{

    public UpRightPhone(Brand brand) {
        super(brand);
        // TODO Auto-generated constructor stub
    }
    
    public void open() {
        super.open();
        System.out.println(" 直立樣式手機 ");
    }
    
    public void close() {
        super.close();
        System.out.println(" 直立樣式手機 ");
    }
    
    public void cell() {
        super.call();
        System.out.println(" 直立樣式手機 ");
    }

}
package com.example.demo.bridge;

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 獲取折疊式手機(樣式 + 品牌)
        Phone phone1 = new FoldedPhone(new XiaoMi());
        phone1.open();
        phone1.call();
        phone1.close();
        
        Phone phone2 = new FoldedPhone(new Vivo());
        phone2.open();
        phone2.call();
        phone2.close();
        
        Phone phone3 = new UpRightPhone(new XiaoMi());
        phone3.open();
        phone3.call();
        phone3.close();
    }

}

橋接模式在JDBC中的源碼解析

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

橋接模式的注意事項和細節(jié)

1)實現(xiàn)了抽象和實現(xiàn)部分的分離刨肃,從而極大的提供了系統(tǒng)的靈活性真友,讓抽象部分和實現(xiàn)部分獨立開來紧帕,這有助于系統(tǒng)進行分層設(shè)計是嗜,從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)。
2)對于系統(tǒng)的高層部分站绪,只需要知道抽象部分和實現(xiàn)部分的接口就可以了丽柿,其它部分由具體業(yè)務(wù)來完成。
3)橋接模式替代多層繼承方案锰蓬,可以減少子類的個數(shù)眯漩,降低系統(tǒng)的管理和維護成本赦抖。
4)橋接模式的引入增加了系統(tǒng)的理解和設(shè)計難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層轮锥,要求開發(fā)者針對抽象進行設(shè)計和編程
5)橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度要尔,因此其使用范圍有一定的局限性赵辕,即需要有這樣的應(yīng)用場景。

橋接模式其它應(yīng)用場景

1)對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng)饲握,橋接模式尤為適用
2)常見的應(yīng)用場景 :
JDBC驅(qū)動程序
銀行轉(zhuǎn)賬系統(tǒng) :
轉(zhuǎn)賬分類 : 網(wǎng)上轉(zhuǎn)賬蚕键,柜臺轉(zhuǎn)賬锣光,AMT轉(zhuǎn)賬(抽象)
轉(zhuǎn)賬用戶類型 :普通用戶,銀卡用戶骑疆,金卡用戶(實現(xiàn))
消息管理
消息類型 :即時消息箍铭,延時消息(抽象)
消息分類 :手機短信椎镣,郵件消息,QQ消息(實現(xiàn))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冷守,一起剝皮案震驚了整個濱河市刀崖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拍摇,老刑警劉巖亮钦,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異充活,居然都是意外死亡蜂莉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門混卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來映穗,“玉大人,你說我怎么就攤上這事蚁滋。” “怎么了赘淮?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵辕录,是天一觀的道長。 經(jīng)常有香客問我拥知,道長踏拜,這世上最難降的妖魔是什么碎赢? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任低剔,我火速辦了婚禮,結(jié)果婚禮上肮塞,老公的妹妹穿的比我還像新娘襟齿。我一直安慰自己,他們只是感情好枕赵,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布猜欺。 她就那樣靜靜地躺著,像睡著了一般拷窜。 火紅的嫁衣襯著肌膚如雪开皿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天篮昧,我揣著相機與錄音赋荆,去河邊找鬼。 笑死懊昨,一個胖子當(dāng)著我的面吹牛窄潭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酵颁,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫉你,長吁一口氣:“原來是場噩夢啊……” “哼月帝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幽污,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤嚷辅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后距误,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潦蝇,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年深寥,在試婚紗的時候發(fā)現(xiàn)自己被綠了攘乒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惋鹅,死狀恐怖则酝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闰集,我是刑警寧澤沽讹,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站武鲁,受9級特大地震影響爽雄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沐鼠,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一挚瘟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饲梭,春花似錦乘盖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兜叨,卻和暖如春穿扳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背国旷。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工矛物, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人议街。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓泽谨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吧雹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 1.初識橋接模式 將抽象部分與它的實現(xiàn)部分分離骨杂,使它們都可以獨立地變化。 Abstraction:抽象部分的接口雄卷。...
    王偵閱讀 913評論 0 7
  • 簡介 1.橋接模式(Bridge模式)是指:將實現(xiàn)與抽象放在兩個不同的類的層次中,使得兩個層次可以獨立改變2.是一...
    是小豬童鞋啦閱讀 215評論 0 0
  • 場景問題 發(fā)送消息 現(xiàn)在我們要實現(xiàn)這樣一個功能:發(fā)送消息搓蚪。從業(yè)務(wù)上看,消息又分成普通消息丁鹉、加急消息和特急消息多種妒潭,...
    陳HHH閱讀 464評論 0 0
  • 一、橋接模式(Bridge Pattern) 在現(xiàn)實生活中揣钦,某些類具有兩個或多個維度的變化雳灾,如圖形既可按形狀分,又...
    dongrui100閱讀 533評論 0 0
  • 文/潮潤澤 ——題記:看哪冯凹!我造新天新地谎亩;從前的事,不再被紀(jì)念宇姚,也不再追想匈庭。——《圣經(jīng).以賽亞書》 推開...
    潮潤澤閱讀 693評論 5 6