設計模式-橋接模式(Bridge)
阿新 • • 發佈:2018-11-24
概述
- 定義 : 將抽象部分與它的具體實現部分分離, 使它們都可以獨立的變化
- 通過組合的方式建立兩個類之間的聯絡, 而不是繼承
- 型別 : 結構型
適用場景
- 抽象和具體實現之間增加更多的靈活性
- 一個類存在兩個或多個獨立變化的維度, 且這兩個或多個維度都需要獨立進行擴充套件
- 不希望使用繼承, 或因為多層繼承導致系統類的個數劇增
優點
- 分離抽象部分及其具體實現部分
- 提高了系統的可擴充套件性
- 符合開閉原則
- 符合合成複用原則
缺點
- 增加了系統的理解與設計難度
- 需要正確識別出系統中兩個獨立變化的維度
模式角色
- 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();
}
}
測試結果:
中國工商銀行賬戶...
這是一個定期賬戶...
中國工商銀行賬戶...
這是一個活期賬戶...
中國農業銀行賬戶...
這是一個定期賬戶...
中國農業銀行賬戶...
這是一個活期賬戶...
可以看出, 使用橋接模式的話, 可以很靈活的組織各種情況