成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

kycool / 3011人閱讀

摘要:橋接模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系組合或者聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化,這就是橋接模式的用意。

0x01.定義與類型

定義:將抽象部分與它的具體實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。

橋接模式將繼承關(guān)系轉(zhuǎn)化成關(guān)聯(lián)關(guān)系,它降低了類與類之間的耦合度,減少了系統(tǒng)中類的數(shù)量,也減少了代碼量。

橋接模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系(組合或者聚合關(guān)系)而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化,這就是橋接模式的用意。

類型:結(jié)構(gòu)型

UML類圖

Java實(shí)現(xiàn)

/**
 * 主類抽象類
 */
public abstract class Abstraction {
    /**
     * 橋接組合對(duì)象
     */
    protected Implementor implementor;

    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    /**
     * 操作類
     */
    public abstract void operation();
}

/**
 * 抽象接口
 */
public interface Implementor {
    void operationImpl();
}

/**
 * 實(shí)現(xiàn)類
 */
public class RefinedAbstraction extends Abstraction {

    public RefinedAbstraction (Implementor implementor) {
        super(implementor);
    }

    @Override
    public void operation() {
        System.out.println("操作");
        implementor.operationImpl();
    }
}

/**
 * 接口抽象實(shí)現(xiàn)1
 */
public class ConcreteImplementorA implements Implementor {
    @Override
    public void operationImpl() {
        System.out.println("橋接A");
    }
}

/**
 * 接口抽象實(shí)現(xiàn)2
 */
public class ConcreteImplementorB implements Implementor {
    @Override
    public void operationImpl() {
        System.out.println("橋接B");
    }
}

測(cè)試與應(yīng)用

/**
 * 測(cè)試與應(yīng)用
 */
public class Test {
    public static void main(String[] args) {

        Abstraction abstraction1 = new RefinedAbstraction(new ConcreteImplementorA());
        Abstraction abstraction2 = new RefinedAbstraction(new ConcreteImplementorB());

        abstraction1.operation();
        abstraction2.operation();
    }
}

輸出結(jié)果

操作
橋接A
操作
橋接B

角色介紹

Abstraction:抽象類,定義其中一個(gè)維度,會(huì)組合實(shí)現(xiàn)類接口。

RefinedAbstraction:擴(kuò)充抽象類,抽象類的派生類,是一個(gè)維度的具體實(shí)現(xiàn)。

Implementor:實(shí)現(xiàn)類接口,另一個(gè)維度的接口。

ConcreteImplementor:具體實(shí)現(xiàn)類,另一個(gè)維度的具體實(shí)現(xiàn)類。

0x02.適用場(chǎng)景

如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。

一個(gè)類存在兩個(gè)(或多個(gè))獨(dú)立變化的維度,且這兩個(gè)(或多個(gè))維度都需要獨(dú)立進(jìn)行擴(kuò)展。

對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。

0x03.優(yōu)點(diǎn)

分離抽象部分及其具體實(shí)現(xiàn)部分,提高了比繼承更好的解決方案。

提高了系統(tǒng)的可擴(kuò)展性,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度,都不需要修改原有系統(tǒng)。

實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明,可以對(duì)用戶隱藏實(shí)現(xiàn)細(xì)節(jié)。

符合開閉原則

符合合成復(fù)用原則

0x04.缺點(diǎn)

橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對(duì)抽象進(jìn)行設(shè)計(jì)與編程。

橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍具有一定的局限性。

0x05.樣例實(shí)現(xiàn)
銀行有農(nóng)業(yè)銀行和工商銀行等等,而賬戶有活期賬戶和死期賬戶,兩個(gè)維度很適合使用橋接模式,下面為具體實(shí)現(xiàn):

Java實(shí)現(xiàn)

/**
 * 銀行抽象類
 */
public abstract class Bank {

    protected Account account;

    public Bank(Account account) {
        this.account = account;
    }

    /**
     * 不限制方法名,但因?yàn)槲伤云鸬囊粯?     * 不要自己都實(shí)現(xiàn)了,要盡量把行為委托給組合的類
     * @return
     */
    abstract Account openAccount();
}

/**
 * 農(nóng)業(yè)銀行實(shí)現(xiàn)類
 */
public class ABCBank extends Bank {

    public ABCBank (Account account) {
        super(account);
    }

    @Override
    Account openAccount() {
        System.out.println("打開中國(guó)農(nóng)業(yè)銀行賬號(hào)");
        account.openAccount();
        return account;
    }
}

/**
 * 工商銀行實(shí)現(xiàn)類
 */
public class ICBCBank extends Bank {

    public ICBCBank(Account account) {
        super(account);
    }

    @Override
    Account openAccount() {
        System.out.println("打開中國(guó)工商銀行賬號(hào)");
        account.openAccount();
        return account;
    }
}

/**
 * 銀行賬號(hào), 橋的實(shí)現(xiàn)接口
 */
public interface Account {
    /**
     * 打開賬號(hào)
     * @return
     */
    Account openAccount();

    /**
     * 查看賬號(hào)類型
     */
    void showAccountType();
}

/**
 * 定期賬戶實(shí)現(xiàn)類
 */
public class DepositAccount implements Account {
    @Override
    public DepositAccount openAccount() {
        System.out.println("打開定期賬號(hào)");
        return new DepositAccount();
    }

    @Override
    public void showAccountType() {
        System.out.println("這是定期賬號(hào)");
    }
}

/**
 * 活期賬戶實(shí)現(xiàn)類
 */
public class SavingAccount implements Account {
    @Override
    public SavingAccount openAccount() {
        System.out.println("打開活期賬號(hào)");
        return new SavingAccount();
    }

    @Override
    public void showAccountType() {
        System.out.println("這是活期賬號(hào)");
    }
}

測(cè)試與應(yīng)用類

/**
 * 測(cè)試與應(yīng)用
 */
public class Test {

    public static void main(String[] args) {
        Bank icbcBank = new ICBCBank(new DepositAccount());
        Account icbcAccount = icbcBank.openAccount();
        icbcAccount.showAccountType();

        Bank abcBank = new ABCBank(new SavingAccount());
        Account abcAccount = abcBank.openAccount();
        abcAccount.showAccountType();
    }
}

輸出結(jié)果

打開中國(guó)工商銀行賬號(hào)
打開定期賬號(hào)
這是定期賬號(hào)
打開中國(guó)農(nóng)業(yè)銀行賬號(hào)
打開活期賬號(hào)
這是活期賬號(hào)

UML類圖

0x06.相關(guān)設(shè)計(jì)模式

橋接模式和組合模式

組合模式強(qiáng)調(diào)的部分和整體的組合

橋接模式是平行級(jí)別上類的組合

橋接模式和適配器模式

都是為了讓兩個(gè)東西配合工作

適配器模式是改變已有的接口讓其配合工作,把目的相似,接口不同的類適配起來。

橋接模式是分離抽象和具體實(shí)現(xiàn),目的是分離,把類的抽象和具體實(shí)現(xiàn)分離開,在此基礎(chǔ)上把接口結(jié)合起來

0x07.源碼中的橋接模式

jdbc: Driver

0x08.源碼地址

設(shè)計(jì)模式之橋接模式: https://github.com/sigmako/design-pattern/tree/master/bridge

0x09.推薦閱讀與參考

慕課網(wǎng)設(shè)計(jì)模式精講: https://coding.imooc.com/class/270.html

設(shè)計(jì)模式讀書筆記-----橋接模式: https://www.cnblogs.com/chenssy/p/3317866.html

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76249.html

相關(guān)文章

  • Java設(shè)計(jì)模式(六)——橋接模式

    摘要:橋接模式定義橋接模式定義抽象化角色它的主要職責(zé)是定義出該角色的行為,同時(shí)保存一個(gè)對(duì)實(shí)現(xiàn)化角色的引用,該角色一般是抽象類。這種優(yōu)雅的實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換方式就是利用了橋接模式。1、什么是橋接模式?Decouple an abstraction from its implementation so that the two can vary independently.橋接模式(Bridge Patt...

    番茄西紅柿 評(píng)論0 收藏2637
  • JavaScript面試系列:JavaScript設(shè)計(jì)模式橋接模式和懶加載

    摘要:橋接模式的核心在于將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。看起來這個(gè)版本已經(jīng)很完美了不,它仍然有可以優(yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實(shí)現(xiàn)版本這個(gè)實(shí)現(xiàn)包含了三個(gè)函數(shù)。這個(gè)例子體現(xiàn)了橋接模式的作用。 我寫的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請(qǐng)求的原因?...

    tracymac7 評(píng)論0 收藏0
  • 聽飛狐聊JavaScript設(shè)計(jì)模式系列11

    摘要:橋接模式之特權(quán)函數(shù)特權(quán)函數(shù),用一些具有特權(quán)的方法作為橋梁以便訪問私有空間,可以回憶一下之前的系列。連續(xù)自然數(shù)分組,計(jì)算最多組的個(gè)數(shù)將至這個(gè)連續(xù)自然數(shù)分成組使每組相加的值相等。個(gè)數(shù)組中數(shù)字最多的一組有個(gè)此時(shí)的和為。 本回內(nèi)容介紹 上一回,聊了適配器模式,圖片預(yù)加載,介一回,聊橋接模式(Bridge),跟之前一樣,難度比較小,橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,通過橋接模式聯(lián)系彼此,同時(shí)...

    wanglu1209 評(píng)論0 收藏0
  • JS 橋接模式

    摘要:簡(jiǎn)介橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。同時(shí)橋接模式也有自己的缺點(diǎn)大量的類將導(dǎo)致開發(fā)成本的增加,同時(shí)在性能方面可能也會(huì)有所減少。 1. 簡(jiǎn)介 橋接模式(Bridge)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。其實(shí)就是函數(shù)的封裝,比如要對(duì)某個(gè)DOM元素添加color和backgroundColor,可以封裝個(gè)changeColor函數(shù),這樣可以在多個(gè)...

    chemzqm 評(píng)論0 收藏0
  • PHP基礎(chǔ)

    摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...

    HtmlCssJs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

kycool

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<