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

原文地址:LoveDev

橋接模式是種很實(shí)用的結(jié)構(gòu)型設(shè)計(jì)模式,又稱為柄體模式或接口模式,該模式可以將兩個(gè)維度的變化分離開(kāi),讓系統(tǒng)更符合“單一職責(zé)原則”,與多層繼承方案不同,它將兩個(gè)獨(dú)立變化的維度設(shè)計(jì)為兩個(gè)獨(dú)立的繼承等級(jí)結(jié)構(gòu),并在抽象層建立抽象關(guān)聯(lián),該關(guān)聯(lián)關(guān)系類似一條連接兩個(gè)獨(dú)立繼承結(jié)構(gòu)的橋,故而叫橋接模式

UML
UML
  • Abstraction(抽象類):一般是抽象類,其中定義一個(gè) Implementor 類型的對(duì)象,它與 Implementor 之間具有關(guān)聯(lián)關(guān)系。該類可以包含抽象業(yè)務(wù)方法,也可以包含具體業(yè)務(wù)方法
  • RefineAbstraction(擴(kuò)展抽象類):一般是具體類而不是抽象類,實(shí)現(xiàn) Abstraction 中的抽象方法
  • Implementor(實(shí)現(xiàn)類接口):該接口一般情況僅提供基本操作,Abstraction 中做更多更復(fù)雜的操作,Implementor 接口對(duì)這些基本操作進(jìn)行聲明,具體實(shí)現(xiàn)交給子類,通過(guò)關(guān)聯(lián)關(guān)系,Abstraction 不僅擁有自己的方法,還可以調(diào)用 Implementor 中的方法,使用關(guān)聯(lián)關(guān)系代替繼承關(guān)系
  • ConcreteImplementor(具體實(shí)現(xiàn)類):代替父類對(duì)象,提供給抽象類做具體的業(yè)務(wù)

舉一個(gè)衣服店的例子,店里現(xiàn)在只剩下兩種衣服,黃色 XXL 號(hào)和紅色 M 號(hào)的,衣服這個(gè)對(duì)象具有至少兩個(gè)維度的變化,一個(gè)是衣服尺碼,一個(gè)是衣服顏色,現(xiàn)在來(lái)看用橋接模式實(shí)現(xiàn)衣服對(duì)象的代碼示例:

Implementor 類:

public interface Color {
    String dyeing();
}

ConcreteImplementor 類:

public class Yellow implements Color {
    @Override
    public String dyeing() {
        return "黃色";
    }
}

Abstraction 類:

public abstract class Clothes {

    public Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void getClothes();
}

RefineAbstraction 類:

public class XXLClothes extends Clothes {

    @Override
    public void getClothes() {
        String s = null;
        if (color != null) {
            s = color.dyeing();
        }
        LogUtils.i(s + "XXL號(hào)的衣服");
    }
}

Client 類:

Yellow yellow = new Yellow();
XXLClothes xxlClothes = new XXLClothes();
xxlClothes.setColor(yellow);
xxlClothes.getClothes();

現(xiàn)在需要增加幾種衣服的類型,就會(huì)很快捷方便,也遵守“開(kāi)閉原則”比如增加一個(gè)粉色 L 號(hào)衣服對(duì)象,首先增加一個(gè) RefineAbstraction 類:

public class LClothes extends Clothes {

    @Override
    public void getClothes() {
        String s = null;
        if (color != null) {
            s = color.dyeing();
        }
        LogUtils.i(s + "L號(hào)的衣服");
    }
}

再添加一個(gè) ConcreteImplementor 類:

public class Pink implements Color {
    @Override
    public String dyeing() {
        return "粉色";
    }
}

Client 類:

Yellow Pink = new Pink();
LClothes lClothes = new LClothes();
lClothes.setColor(Pink);
lClothes.getClothes();

橋接模式中體現(xiàn)了很多面向?qū)ο笤O(shè)計(jì)原則的思想:

  • 單一職責(zé)原則:一個(gè)類負(fù)責(zé)一項(xiàng)職責(zé)
  • 開(kāi)閉原則:開(kāi)放擴(kuò)展,關(guān)閉修改
  • 里氏替換:子類能完全替代父類
  • 依賴倒置:不依賴細(xì)節(jié),依賴抽象

橋接模式的好處有很多,但是對(duì)使用者有一定的經(jīng)驗(yàn)要求,需要正確識(shí)別獨(dú)立變化的兩個(gè)維度,以及一開(kāi)始就要對(duì)抽象層進(jìn)行設(shè)計(jì)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是橋接模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一、...
    w1992wishes閱讀 1,877評(píng)論 0 6
  • 1 場(chǎng)景問(wèn)題# 1.1 發(fā)送提示消息## 考慮這樣一個(gè)實(shí)際的業(yè)務(wù)功能:發(fā)送提示消息。基本上所有帶業(yè)務(wù)流程處理的系統(tǒng)...
    七寸知架構(gòu)閱讀 5,230評(píng)論 5 63
  • 由于實(shí)際的需要,某個(gè)類具有兩個(gè)或兩個(gè)以上的維度變化,如果利用繼承將每種可能的變化情況都定義成一個(gè)類,一是會(huì)導(dǎo)致類膨...
    時(shí)待吾閱讀 702評(píng)論 0 0
  • 定義 Java注解又稱Java標(biāo)注,是Java語(yǔ)言5.0版本開(kāi)始支持加入源代碼的特殊語(yǔ)法元數(shù)據(jù)(元數(shù)據(jù) Metad...
    craneyuan閱讀 830評(píng)論 0 1
  • 1 我真的被六子6P天馬行空的思維繞的頭暈?zāi)垦A?,?jīng)過(guò)他的五維閱讀課、越讀營(yíng)社群無(wú)貢獻(xiàn)就抱走、領(lǐng)500人共讀彭小六...
    堅(jiān)持星球演講教練黨黨閱讀 565評(píng)論 1 6

友情鏈接更多精彩內(nèi)容