1. 程式人生 > >設計模式-橋接模式(Bridge)

設計模式-橋接模式(Bridge)

概述

  • 定義 : 將抽象部分與它的具體實現部分分離, 使它們都可以獨立的變化
  • 通過組合的方式建立兩個類之間的聯絡, 而不是繼承
  • 型別 : 結構型

適用場景

  • 抽象和具體實現之間增加更多的靈活性
  • 一個類存在兩個或多個獨立變化的維度, 且這兩個或多個維度都需要獨立進行擴充套件
  • 不希望使用繼承, 或因為多層繼承導致系統類的個數劇增

優點

  • 分離抽象部分及其具體實現部分
  • 提高了系統的可擴充套件性
  • 符合開閉原則
  • 符合合成複用原則

缺點

  • 增加了系統的理解與設計難度
  • 需要正確識別出系統中兩個獨立變化的維度

模式角色

  • Abstraction
  • 定義抽象類的介面。
  • 維護一個指向Implementor型別物件的引用。
  • RefinedAbstraction : 擴充由Abstraction定義的介面。
  • Implementor : 定義實現類的介面,該介面不一定要與Abstraction的介面完全一致;事實上這兩個
    介面可以完全不同。一般來講,Implementor 介面僅提供基本操作,而Abstraction則
    定義了基於這些基本操作的較高層次的操作
  • ConcreteImplementor : 實現Implementor介面並定義它的具體實現。

程式碼實現

業務場景

開啟銀行賬戶, 顯示是哪個銀行的,賬戶型別是什麼

  • 銀行介面對應模式中Abstraction角色
  • 具體銀行實現對應模式中RefinedAbstraction
  • 賬戶對應模式中Implementor介面
  • 賬戶實現類對應模式中ConcreteImplementor

UML類圖

在這裡插入圖片描述

程式碼實現

這裡給Bank增加兩個實現類, 一個工商銀行, 一個農業銀行, 給Account也增加兩個實現類, 一個定期存款賬戶, 一個活期存款賬戶, 詳細程式碼如下:
Account介面 :

/**
 * 賬戶介面
 * @author 七夜雪
 * @create 2018-11-23 20:49
 */
public interface Account { public void openAccount(); }

定期賬戶實現 :

/**
 * 定期賬戶
 *
 * @author 七夜雪
 * @create 2018-11-23 20:50
 */
public class FixedAccount implements Account {
    @Override
    public void openAccount() {
        System.out.println("這是一個定期賬戶...");
    }
}

活期賬戶實現 :

/**
 * 活期賬戶
 *
 * @author 七夜雪
 * @create 2018-11-23 20:52
 */
public class CurrentAccount implements Account {
    @Override
    public void openAccount() {
        System.out.println("這是一個活期賬戶...");
    }
}

Bank介面 :

/**
 * 銀行介面
 * @author 七夜雪
 * @create 2018-11-23 20:49
 */
public interface Bank {
    public void openAccount();
}

工商銀行實現 :

/**
 * 中國工商銀行
 *
 * @author 七夜雪
 * @create 2018-11-23 20:53
 */
public class ICBCBank implements Bank {
    private Account account;

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

    @Override
    public void openAccount() {
        System.out.println("中國工商銀行賬戶...");
        account.openAccount();
    }
}

農業銀行實現 :

/**
 * 中國農業銀行
 *
 * @author 七夜雪
 * @create 2018-11-23 20:52
 */
public class ABCBank implements Bank {
    private Account account;

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

    @Override
    public void openAccount() {
        System.out.println("中國農業銀行賬戶...");
        account.openAccount();
    }
}

測試類 :

/**
 * 測試類
 *
 * @author 七夜雪
 * @create 2018-11-23 20:56
 */
public class Client {

    public static void main(String[] args) {
        Account currentAccount = new CurrentAccount();
        Account fixedAccount = new FixedAccount();
        // 工商銀行 + 定期
        Bank icbcBank1 = new ICBCBank(fixedAccount);
        // 工商銀行 + 活期
        Bank icbcBank2 = new ICBCBank(currentAccount);

        // 農業銀行 + 定期
        Bank abcBank1 = new ABCBank(fixedAccount);
        // 工商銀行 + 活期
        Bank abcBank2 = new ABCBank(currentAccount);

        icbcBank1.openAccount();
        icbcBank2.openAccount();
        abcBank1.openAccount();
        abcBank2.openAccount();

    }

}

測試結果:

中國工商銀行賬戶...
這是一個定期賬戶...
中國工商銀行賬戶...
這是一個活期賬戶...
中國農業銀行賬戶...
這是一個定期賬戶...
中國農業銀行賬戶...
這是一個活期賬戶...

可以看出, 使用橋接模式的話, 可以很靈活的組織各種情況