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

簡(jiǎn)介

橋接模式(Bridge Pattern)是一種結(jié)構(gòu)性設(shè)計(jì)模式,它的主要作用是將抽象部分和實(shí)現(xiàn)部分解耦霹陡,使它們可以獨(dú)立變化而不會(huì)互相影響和蚪。橋接模式最早由GoF(Gang of Four)提出,在《設(shè)計(jì)模式》一書中有詳細(xì)的介紹烹棉。

橋接模式和其他設(shè)計(jì)模式的區(qū)別在于它關(guān)注的是如何將抽象和實(shí)現(xiàn)分離攒霹,從而達(dá)到靈活性和可擴(kuò)展性的目的。與之相比浆洗,適配器模式關(guān)注的是如何將不兼容的接口轉(zhuǎn)換成可兼容的接口催束,裝飾者模式關(guān)注的是如何動(dòng)態(tài)地為對(duì)象添加行為,而組合模式則是將對(duì)象組合成樹形結(jié)構(gòu)伏社,以表示“部分-整體”的層次結(jié)構(gòu)抠刺。

實(shí)現(xiàn)

假設(shè)我們正在構(gòu)建一個(gè)圖形用戶界面(GUI)框架,我們需要支持多個(gè)操作系統(tǒng)和窗口管理器摘昌。我們可以使用橋接模式來實(shí)現(xiàn)這個(gè)功能速妖。我們可以將操作系統(tǒng)和窗口管理器的實(shí)現(xiàn)分開,以便它們可以獨(dú)立地變化聪黎。我們可以定義一個(gè)抽象的Window類罕容,它有一個(gè)實(shí)現(xiàn)了WindowImpl接口的實(shí)例變量。WindowImpl接口表示窗口管理器的實(shí)現(xiàn)稿饰。我們可以定義一個(gè)操作系統(tǒng)的抽象類锦秒,它有一個(gè)實(shí)現(xiàn)了OsImpl接口的實(shí)例變量。OsImpl接口表示操作系統(tǒng)的實(shí)現(xiàn)湘纵。

下面是一個(gè)示例代碼:

interface WindowImpl {
    void draw(int x, int y, int width, int height, String color);
}

class LinuxWindowImpl implements WindowImpl {
    public void draw(int x, int y, int width, int height, String color) {
        System.out.println("Drawing a Linux window at (" + x + ", " + y + ") with width " + width + ", height " 
                           + height + ", and color " + color);
    }
}

class WindowsWindowImpl implements WindowImpl {
    public void draw(int x, int y, int width, int height, String color) {
        System.out.println("Drawing a Windows window at (" + x + ", " + y + ") with width " + width + ", height " 
                           + height + ", and color " + color);
    }
}

abstract class Window {
    private WindowImpl impl;
    
    public Window(WindowImpl impl) {
        this.impl = impl;
    }
    
    public void draw(int x, int y, int width, int height, String color) {
        impl.draw(x, y, width, height, color);
    }
}

abstract class Os {
    private WindowImpl impl;
    
    public Os(WindowImpl impl) {
        this.impl = impl;
    }
    public void drawWindow(int x, int y, int width, int height, String color) {
        Window window = createWindow(impl);
        window.draw(x, y, width, height, color);
    }

    protected abstract Window createWindow(WindowImpl impl);
}

class LinuxOs extends Os {
    public LinuxOs(WindowImpl impl) {
        super(impl);
    }
    protected Window createWindow(WindowImpl impl) {
        return new LinuxWindow(impl);
    }
}

class WindowsOs extends Os {
    public WindowsOs(WindowImpl impl) {
        super(impl);
    }
    protected Window createWindow(WindowImpl impl) {
        return new WindowsWindow(impl);
    }
}

class LinuxWindow extends Window {
    public LinuxWindow(WindowImpl impl) {
        super(impl);
    }
}

class WindowsWindow extends Window {
    public WindowsWindow(WindowImpl impl) {
        super(impl);
    }
}

在這個(gè)例子中脂崔,WindowImpl接口表示窗口管理器的實(shí)現(xiàn),LinuxWindowImpl和WindowsWindowImpl類分別是Linux和Windows操作系統(tǒng)的窗口管理器的實(shí)現(xiàn)梧喷。Window抽象類有一個(gè)實(shí)現(xiàn)了WindowImpl接口的實(shí)例變量砌左,并且有一個(gè)draw方法脖咐,該方法將調(diào)用WindowImpl的draw方法。Os抽象類也有一個(gè)實(shí)現(xiàn)了WindowImpl接口的實(shí)例變量汇歹,并且有一個(gè)drawWindow方法屁擅,該方法將創(chuàng)建一個(gè)Window對(duì)象,并調(diào)用draw方法产弹。LinuxOs和WindowsOs類分別是Linux和Windows操作系統(tǒng)的實(shí)現(xiàn)派歌,它們都是Os抽象類的子類。它們實(shí)現(xiàn)了createWindow方法痰哨,并返回一個(gè)具體的Window對(duì)象胶果。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 橋接模式可以將抽象部分和實(shí)現(xiàn)部分分離,使它們可以獨(dú)立變化斤斧,從而達(dá)到靈活性和可擴(kuò)展性的目的早抠。
  2. 橋接模式可以讓客戶端代碼僅關(guān)注抽象部分,而不必關(guān)注實(shí)現(xiàn)部分的細(xì)節(jié)
  3. 橋接模式可以減少繼承的使用撬讽,因?yàn)槔^承是一種靜態(tài)的方式蕊连,而橋接模式則是一種動(dòng)態(tài)的方式。

缺點(diǎn):

  1. 橋接模式需要增加額外的抽象和實(shí)現(xiàn)層次游昼,從而增加系統(tǒng)的復(fù)雜度和理解難度甘苍。
  2. 橋接模式需要對(duì)系統(tǒng)進(jìn)行重新設(shè)計(jì),從而增加了開發(fā)的時(shí)間和成本烘豌。

運(yùn)用場(chǎng)景:

橋接模式適用于以下情況:

  1. 當(dāng)一個(gè)類存在兩個(gè)獨(dú)立變化的維度時(shí)载庭,可以使用橋接模式來將它們解耦,從而使它們可以獨(dú)立變化廊佩。
  2. 當(dāng)一個(gè)類需要在運(yùn)行時(shí)切換不同的實(shí)現(xiàn)時(shí)昧捷,可以使用橋接模式來實(shí)現(xiàn)這一需求。
  3. 當(dāng)一個(gè)類的抽象和實(shí)現(xiàn)部分可以分別擴(kuò)展時(shí)罐寨,可以使用橋接模式來實(shí)現(xiàn)這一需求靡挥。

總結(jié)

總的來說,橋接模式是一種結(jié)構(gòu)性設(shè)計(jì)模式鸯绿,它可以將抽象部分和實(shí)現(xiàn)部分解耦跋破,從而使它們可以獨(dú)立變化而不會(huì)互相影響。Java作為一門面向?qū)ο蟮木幊陶Z言瓶蝴,非常適合使用橋接模式來實(shí)現(xiàn)復(fù)雜的軟件系統(tǒng)毒返。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舷手,隨后出現(xiàn)的幾起案子拧簸,更是在濱河造成了極大的恐慌,老刑警劉巖男窟,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盆赤,死亡現(xiàn)場(chǎng)離奇詭異贾富,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)牺六,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門颤枪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淑际,你說我怎么就攤上這事畏纲。” “怎么了春缕?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵盗胀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锄贼,道長(zhǎng)读整,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任咱娶,我火速辦了婚禮,結(jié)果婚禮上强品,老公的妹妹穿的比我還像新娘膘侮。我一直安慰自己,他們只是感情好的榛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布琼了。 她就那樣靜靜地躺著,像睡著了一般夫晌。 火紅的嫁衣襯著肌膚如雪雕薪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天晓淀,我揣著相機(jī)與錄音所袁,去河邊找鬼。 笑死凶掰,一個(gè)胖子當(dāng)著我的面吹牛燥爷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播懦窘,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼前翎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了畅涂?” 一聲冷哼從身側(cè)響起港华,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎午衰,沒想到半個(gè)月后立宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冒萄,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赘理,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宦言。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡商模,死狀恐怖奠旺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情施流,我是刑警寧澤响疚,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瞪醋,受9級(jí)特大地震影響忿晕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜银受,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一践盼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宾巍,春花似錦咕幻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至选浑,卻和暖如春蓝厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古徒。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工拓提, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隧膘。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓崎苗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舀寓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胆数,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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