Bridge模式
《設計模式》對Bridge模式的意圖叙述為:将抽象與實作解耦,使它們都可以獨立地變化。(一開始沒太懂抽象為啥能和實作分離,後來讀完才知道,這裡的指A抽象與B實作解耦,而不是指同一個對象)
這裡的實作指的是抽象類及其派生類用來實作自己的對象(而不是抽象類的派生類,這些派生類被稱為具體類)。
示例研究
1、示例初始描述
編寫一個程式,使用兩種繪圖程式之一繪制矩形(使用兩個對點的坐标定義)。已知兩種繪圖程式DP1和DP2:
DP1 | DP2 | |
---|---|---|
畫線 | draw_a_line(x1,y1,x2,y2) | drawline(x1,x2,y1,y2) |
畫圓 | draw_a_circle(x,y,r) | drawcircle(x,y,r) |
矩形和繪圖程式(DP1和DP2)設計的類圖如下:

解決方案:引入抽象類Rectangle,V1Rectangle和V2Rectangle分别使用DP1和DP2引用實作。
2、需求變更
現在需要使用DP1和DP2增加支援另一種形狀Circle。
解決方案如下:
但是這個方法帶來的新的問題,考慮如下情況:
- Shape類的具體類型有4中
- 如果還有一種繪圖程式,那麼将産生具體類型6種
- 如果還有一種圖形需要繪制,那麼将産生具體類型9種
于是爆炸性增長問題出現了。因為這個方案中的抽象與其實作是緊耦合的。每種形狀都必須知道自己使用了何種繪圖程式。需要有一種方式将抽象上的變化和實作上的變化分開。
Bridge模式
當存在一個抽象有不同實作時,Bridge模式最為适用,它可以是抽象和實作互相獨立地進行變化。
首先找到什麼在發生變化。上述問題裡,變化的是形狀的種類和繪圖程式的種類。共同概念是“形狀”和“繪圖程式”。
解決方案如下:
Shape類通過Drawing類具體實作自己的行為。
Bridge模式 | 關鍵特征 |
---|---|
意圖 | 将一組實作與另一組使用它們的對象分離 |
問題 | 一個抽象類的派生類必須使用多個實作,但不能出現類的爆炸性增長 |
解決方案 | 為所有實作定義一個接口,供抽象類的所有派生類使用 |
參與者與協作者 | AbStraction為要實作的對象定義接口,Implememtor為具體的實作類定義接口。Abstraction的派生類使用Implementor的派生類,但無需知道自己具體使用了哪一個ConcreteImplementor |
效果 | 實作與使用的對象解耦,提供了可擴充性,客戶無需關注實作問題 |
實作 | 1、将實作封裝在抽象類中 2、在要實作的抽象類的基類彙總包含一個實作的句柄。注意:在Java中,你可以在實作中使用接口代替抽象類 |
參考《設計模式解析》第二版