橋接模式

橋接模式

定義
  1. 將抽象部分與具體部分分離,使他們均可以獨立的變化。
  2. 經過組合的方式創建兩個雷之間的聯繫,而不是繼承。
類型

結構型java

使用場景
  1. 抽象和具體實現之間的增長更多的靈活性。
  2. 一個類存在兩個(或多個)獨立變化的維度,且者兩個(或多個)維度都須要獨立進行擴展。
  3. 不但願使用多層繼承致使系統中類的個數劇增。
優勢
  1. 分離抽象部分機器具體實現部分(使抽象和繼承再也不在同一個繼承層次中,讓抽象和實現能夠在各自的維度中發展)
  2. 提升了系統的可擴展性
  3. 符合開閉原則
  4. 符合合成複用原則
難點

在使用橋接模式時難點就是須要正確的識別系統中兩個獨立變化的維度。ide

在寫代碼以前咱們先假設一個場景,咱們如今要實現一個銀行的存款操做,存款的話就包括有活期和按期之分,而後存款也有不一樣的銀行。咱們就要用代碼來模擬這個操做。咱們說橋接模式的難點就在於抽象和實現進行分離。咱們如今先用一個接口當作抽象層。把帳戶的相關操做放進這個接口裏面。測試

public interface Account {
    Account openAccount();
    void showAccountType();

}

這裏定義了兩個方法,而後咱們寫一下銀行的抽象類,一會咱們要委託這個抽象類來執行具體的操做。this

public abstract class Bank {
    protected Account account;
    public Bank(Account account){
        this.account = account;
    }
    abstract Account openAccount();
}

咱們這裏定義了一個與接口相同名稱的方法,爲何要這麼作呢?咱們一會再解答。這裏有一個帳戶的屬性,而後將帳戶對象注入進來,使用構造器的方式注入。咱們再實現一下具體的銀行類。咱們來寫一個農業銀行ABCBank一個工商銀行ICBCBank(愛存不存銀行)。這個兩個銀行繼承bank抽象類。實現抽象方法。code

//ABCBank
public class ABCBank extends Bank {
    public ABCBank(Account account) {
        super(account);
    }

    @Override
    Account openAccount() {
        System.out.println("打開中國農業銀行帳號");
       account.openAccount();  //這一行很關鍵,這是委託父類執行操做的代碼
        return account;
    }
}
//ICBCBank
public class ICBCBank extends Bank {
    public ICBCBank(Account account) {
        super(account);
    }

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

這個實現類繼承抽象類,在執行openAccount是直接調用父類的方法。這時候咱們說一下爲何要讓抽象類和接口同樣的名稱呢,其實這個不同也是能夠的,咱們寫成同樣的只是想讓他們表同樣的操做,咱們的openAccount方法重點是要調用account的openAccount。對象

// DepositAccount
public class DepositAccount implements Account {
    @Override
    public Account openAccount() {
        System.out.println("打開按期帳號");
        return new DepositAccount();
    }

    @Override
    public void showAccountType() {
        System.out.println("這是一個按期帳號");
    }
}
//SavingAccount
public class SavingAccount implements Account {
    @Override
    public Account openAccount() {
        System.out.println("打開活期帳號");
        //...
        return new SavingAccount();
    }

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

這兩個實現類實現了接口方法。咱們最後看看測試類。繼承

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

        Bank icbcBank2 = new ICBCBank(new SavingAccount());
        Account icbcAccount2 = icbcBank2.openAccount();
        icbcAccount2.showAccountType();

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

咱們建立一個銀行對象將農業銀行賦值給他,同時將一個按期帳戶傳入構造器,注入銀行類中,而後銀行類在執行openAccount方法調用的是account類的openAccount方法,這樣的話咱們就講account和bank類組合到了一塊兒。後面咱們在擴展好比添加bank類時就和account類解耦了,再經過他們的排列組合就能夠獲得不少結果了。最後咱們看一下運行結果。接口

打開中國工商銀行帳號
打開按期帳號
這是一個按期帳號
打開中國工商銀行帳號
打開活期帳號
這是一個活期帳號
打開中國農業銀行帳號
打開活期帳號
這是一個活期帳號
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息