結構型java
在使用橋接模式時難點就是須要正確的識別系統中兩個獨立變化的維度。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類解耦了,再經過他們的排列組合就能夠獲得不少結果了。最後咱們看一下運行結果。接口
打開中國工商銀行帳號 打開按期帳號 這是一個按期帳號 打開中國工商銀行帳號 打開活期帳號 這是一個活期帳號 打開中國農業銀行帳號 打開活期帳號 這是一個活期帳號