Java設計模式之《橋接模式》及應用場景


原創作品,可以轉載,但是請標注出處地址http://www.cnblogs.com/V1haoge/p/6497919.html

  這里摘抄一份他處的概念,你可以不必理會,先看下面得講解與實例,然后返回來理解概念,不然抽象的概念會讓你崩潰...

  橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。

  這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。

  個人理解:橋接是一個接口,它與一方應該是綁定的,也就是解耦的雙方中的一方必然是繼承這個接口的,這一方就是實現方,而另一方正是要與這一方解耦的抽象方,如果不采用橋接模式,一般我們的處理方式是直接使用繼承來實現,這樣雙方之間處於強鏈接,類之間關聯性極強,如要進行擴展,必然導致類結構急劇膨脹。采用橋接模式,正是為了避免這一情況的發生,將一方與橋綁定,即實現橋接口,另一方在抽象類中調用橋接口(指向的實現類),這樣橋方可以通過實現橋接口進行單方面擴展,而另一方可以繼承抽象類而單方面擴展,而之間的調用就從橋接口來作為突破口,不會受到雙方擴展的任何影響。

  下面的實例能真正體現着一點:

  實例准備:我們假設有一座橋,橋左邊為A,橋右邊為B,A有A1,A2,A3等,表示橋左邊的三個不同地方,B有B1,B2,B3等,表示橋右邊的三個不同地方,假設我們要從橋左側A出發到橋的右側B,我們可以有多重方案,A1到B1,A1到B2,A1到B3,A2到B1...等等,以此為例,代碼如下:

橋接口:Qiao

1 public interface Qiao {
2     //目的地B
3     void targetAreaB();
4 }

目的地B1,B2,B3:

 1 /**
 2  * 目的地B1
 3  */
 4 public class AreaB1 implements Qiao {
 5 
 6     @Override
 7     public void targetAreaB() {
 8         System.out.println("我要去B1");
 9     }
10 
11 }
12 
13 /**
14  * 目的地B2
15  */
16 public class AreaB2 implements Qiao {
17 
18     @Override
19     public void targetAreaB() {
20         System.out.println("我要去B2");
21     }
22 
23 }
24 
25 /**
26  * 目的地B3
27  */
28 public class AreaB3 implements Qiao {
29 
30     @Override
31     public void targetAreaB() {
32         System.out.println("我要去B3");
33     }
34 
35 }

抽象來源地A:AreaA

1 public abstract class AreaA {
2     //引用橋接口
3     Qiao qiao;
4     //來源地
5     abstract void fromAreaA();
6 }

來源地A1,A2,A3:

 1 /**
 2  * 來源地A1
 3  */
 4 public class AreaA1 extends AreaA {
 5 
 6     @Override
 7     void fromAreaA() {
 8         System.out.println("我來自A1");
 9     }
10     
11 }
12 
13 /**
14  * 來源地A2
15  */
16 public class AreaA2 extends AreaA {
17 
18     @Override
19     void fromAreaA() {
20         System.out.println("我來自A2");
21     }
22 
23 }
24 
25 /**
26  * 來源地A3
27  */
28 public class AreaA3 extends AreaA {
29 
30     @Override
31     void fromAreaA() {
32         System.out.println("我來自A3");
33     }
34 
35 }

測試類:Clienter

1 public class Clienter {
2     public static void main(String[] args) {
3         AreaA a = new AreaA2();
4         a.qiao = new AreaB3();
5         a.fromAreaA();
6         a.qiao.targetAreaB();
7     }
8 }

運行結果:

我來自A2
我要去B3

  如何,只要你認真看完了實例,你就明白了這種模式的好處,現在我們要添加來源地和目的地,只要繼續繼承AreaA和實現Qiao即可,之前我所說的綁定,正式此處將橋與目的地綁定在一起,使用一個接口完成。

  其實要完成橋接模式,注意點並不多,重在理解模式的使用場景。

  注意點:

    1、定義一個橋接口,使其與一方綁定,這一方的擴展全部使用實現橋接口的方式。

    2、定義一個抽象類,來表示另一方,在這個抽象類內部要引入橋接口,而這一方的擴展全部使用繼承該抽象類的方式。

  其實我們可以發現橋接模式應對的場景有方向性的,橋綁定的一方都是被調用者,屬於被動方,抽象方屬於主動方。

  其實我的JDK提供的JDBC數據庫訪問接口API正是經典的橋接模式的實現者,接口內部可以通過實現接口來擴展針對不同數據庫的具體實現來進行擴展,而對外的僅僅只是一個統一的接口調用,調用方過於抽象,可以將其看做每一個JDBC調用程序(這是真實實物,當然不存在抽象)

  下面來理解一下開頭的概念:

  橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。

  這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。

 

  理解:此處抽象化與實現化分別指代實例中的雙方,而且實現化對應目的地方(通過實現橋接口進行擴展),抽象方對應來源地方(通過繼承抽象類來進行擴展),如果我們不使用橋接模式,我們會怎么想實現這個實例呢?很簡單,我們分別定義來源地A1、A2、A3類和目的地B1、B2、B3,然后具體的實現就是,A1到B1一個類,A1到B2一個類,等,如果我們要擴展了A和B ,要直接增加An類和Bn類,如此編寫不說類內部重復性代碼多,而且還會導致類結構的急劇膨脹,最重要的是,在通過繼承實現路徑的時候,會造成雙方耦合性增大,而這又進一步加劇了擴展的復雜性。使用橋結構模式可以很好地規避這些問題:重在解耦。


同系列文章:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM