1. 程式人生 > 實用技巧 >設計模式之橋接模式

設計模式之橋接模式

基本認識

將抽象和實現解耦,使得兩者可以獨立地變化

是一種結構型設計模式

橋接模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責,它的主要特點是把抽象與行為實現分離開來,從而可以保持各部分的獨立性以及應對它們的功能擴充套件。

橋接模式雖然是一個使用頻率不高的模式,但是熟悉該模式對於理解面向物件的設計原則,包括開閉原則都很有幫助,有助於形成正確的設計思想和培養良好的設計風格。

  • Client類:橋接模式的呼叫者。
  • 抽象類(Abstraction):維護了Implementor及它的實現類ConcreteImplementorA。二者是聚合關係,Abstraction充當橋接類。
  • RefinedAbstraction:是Abstraction抽象類的子類。
  • Implementor:行為實現類的介面。
  • ConcreteImplementorA/B:行為的具體實現類。

傳統方式

案例

現在對不同手機型別的不同品牌實現程式設計操作,比如開機、關機、打電話等。

思路分析

問題分析

擴充套件性問題(類爆炸),如果我們再增加手機的樣式(旋轉式),就需要增加各個品牌手機的類,同樣如果我們增加一個手機品牌,也要在各個手機樣式類下增加。

違反了單一職責原則,當我們增加手機樣式時,要同時增加所有品牌的手機,這樣增加了程式碼維護成本。

解決方案:使用橋接模式

橋接模式

思路分析

程式碼實現

1publicinterfaceBrand{
2voidopen();
3
4voidclose();
5
6voidcall();
7}

 1publicclassVivoimplementsBrand{
2@Override
3publicvoidopen(){
4System.out.println("Vivo手機開機");
5}
6
7@Override
8publicvoidclose(){
9System.out.println("Vivo手機關機");
10}
11
12@Override
13publicvoidcall(){
14System.out.println("Vivo手機打電話"
);
15}
16}

 1publicclassXiaoMiimplementsBrand{
2@Override
3publicvoidopen(){
4System.out.println("小米手機開機了");
5}
6
7@Override
8publicvoidclose(){
9System.out.println("小米手機關機了");
10}
11
12@Override
13publicvoidcall(){
14System.out.println("小米手機打電話");
15}
16}

 1publicabstractclassPhone{
2
3privateBrandbrand;//組合品牌
4
5publicPhone(Brandbrand){//構造器
6this.brand=brand;
7}
8
9protectedvoidopen(){
10this.brand.open();
11}
12
13protectedvoidclose(){
14this.brand.close();
15}
16
17protectedvoidcall(){
18this.brand.call();
19}
20}

 1//摺疊式手機類
2publicclassFoldedPhoneextendsPhone{
3publicFoldedPhone(Brandbrand){
4super(brand);
5}
6
7publicvoidopen(){
8super.open();
9System.out.println("摺疊樣式手機");
10}
11publicvoidclose(){
12super.close();
13System.out.println("摺疊樣式手機");
14}
15publicvoidcall(){
16super.call();
17System.out.println("摺疊樣式手機");
18}
19}

注意事項

實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。

對於系統的高層部分,只需知道抽象部分和實現部分的介面就可以了,其它的部分由具體業務來完成。

橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和程式設計。

橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象、實現),因此其適用範圍有一定的侷限性,即需要有這樣的應用場景。

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