国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

設計模式之橋接模式

kycool / 2982人閱讀

摘要:橋接模式中的所謂脫耦,就是指在一個軟件系統的抽象化和實現化之間使用關聯關系組合或者聚合關系而不是繼承關系,從而使兩者可以相對獨立地變化,這就是橋接模式的用意。

0x01.定義與類型

定義:將抽象部分與它的具體實現部分分離,使它們都可以獨立地變化。

橋接模式將繼承關系轉化成關聯關系,它降低了類與類之間的耦合度,減少了系統中類的數量,也減少了代碼量。

橋接模式中的所謂脫耦,就是指在一個軟件系統的抽象化和實現化之間使用關聯關系(組合或者聚合關系)而不是繼承關系,從而使兩者可以相對獨立地變化,這就是橋接模式的用意。

類型:結構型

UML類圖

Java實現

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

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

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

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

/**
 * 實現類
 */
public class RefinedAbstraction extends Abstraction {

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

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

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

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

測試與應用

/**
 * 測試與應用
 */
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();
    }
}

輸出結果

操作
橋接A
操作
橋接B

角色介紹

Abstraction:抽象類,定義其中一個維度,會組合實現類接口。

RefinedAbstraction:擴充抽象類,抽象類的派生類,是一個維度的具體實現。

Implementor:實現類接口,另一個維度的接口。

ConcreteImplementor:具體實現類,另一個維度的具體實現類。

0x02.適用場景

如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。

一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立進行擴展。

對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。

0x03.優點

分離抽象部分及其具體實現部分,提高了比繼承更好的解決方案。

提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。

實現細節對客戶透明,可以對用戶隱藏實現細節。

符合開閉原則

符合合成復用原則

0x04.缺點

橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程。

橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用范圍具有一定的局限性。

0x05.樣例實現
銀行有農業銀行和工商銀行等等,而賬戶有活期賬戶和死期賬戶,兩個維度很適合使用橋接模式,下面為具體實現:

Java實現

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

    protected Account account;

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

    /**
     * 不限制方法名,但因為委派所以起的一樣
     * 不要自己都實現了,要盡量把行為委托給組合的類
     * @return
     */
    abstract Account openAccount();
}

/**
 * 農業銀行實現類
 */
public class ABCBank extends Bank {

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

    @Override
    Account openAccount() {
        System.out.println("打開中國農業銀行賬號");
        account.openAccount();
        return account;
    }
}

/**
 * 工商銀行實現類
 */
public class ICBCBank extends Bank {

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

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

/**
 * 銀行賬號, 橋的實現接口
 */
public interface Account {
    /**
     * 打開賬號
     * @return
     */
    Account openAccount();

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

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

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

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

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

測試與應用類

/**
 * 測試與應用
 */
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();
    }
}

輸出結果

打開中國工商銀行賬號
打開定期賬號
這是定期賬號
打開中國農業銀行賬號
打開活期賬號
這是活期賬號

UML類圖

0x06.相關設計模式

橋接模式和組合模式

組合模式強調的部分和整體的組合

橋接模式是平行級別上類的組合

橋接模式和適配器模式

都是為了讓兩個東西配合工作

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

橋接模式是分離抽象和具體實現,目的是分離,把類的抽象和具體實現分離開,在此基礎上把接口結合起來

0x07.源碼中的橋接模式

jdbc: Driver

0x08.源碼地址

設計模式之橋接模式: https://github.com/sigmako/design-pattern/tree/master/bridge

0x09.推薦閱讀與參考

慕課網設計模式精講: https://coding.imooc.com/class/270.html

設計模式讀書筆記-----橋接模式: https://www.cnblogs.com/chenssy/p/3317866.html

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76249.html

相關文章

  • Java設計模式(六)——橋接模式

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

    番茄西紅柿 評論0 收藏2637
  • JavaScript面試系列:JavaScript設計模式橋接模式和懶加載

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

    tracymac7 評論0 收藏0
  • 聽飛狐聊JavaScript設計模式系列11

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

    wanglu1209 評論0 收藏0
  • JS 橋接模式

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

    chemzqm 評論0 收藏0
  • PHP基礎

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

    HtmlCssJs 評論0 收藏0

發表評論

0條評論

kycool

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<