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

原創做品,能夠轉載,可是請標註出處地址http://www.cnblogs.com/V1haoge/p/6497919.htmlhtml

  這裏摘抄一份他處的概念,你能夠沒必要理會,先看下面得講解與實例,而後返回來理解概念,否則抽象的概念會讓你崩潰...數據庫

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

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

  我的理解:橋接是一個接口,它與一方應該是綁定的,也就是解耦的雙方中的一方必然是繼承這個接口的,這一方就是實現方,而另外一方正是要與這一方解耦的抽象方,若是不採用橋接模式,通常咱們的處理方式是直接使用繼承來實現,這樣雙方之間處於強連接,類之間關聯性極強,如要進行擴展,必然致使類結構急劇膨脹。採用橋接模式,正是爲了不這一狀況的發生,將一方與橋綁定,即實現橋接口,另外一方在抽象類中調用橋接口(指向的實現類),這樣橋方能夠經過實現橋接口進行單方面擴展,而另外一方能夠繼承抽象類而單方面擴展,而之間的調用就從橋接口來做爲突破口,不會受到雙方擴展的任何影響。測試

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

  實例準備:咱們假設有一座橋,橋左邊爲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:code

 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:AreaAhtm

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便可,以前我所說的綁定,正式此處將橋與目的地綁定在一塊兒,使用一個接口完成。

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

  注意點:

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

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

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

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

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

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

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

 

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


同系列文章:

相關文章
相關標籤/搜索