天天看點

設計模式(五)【Bridge模式】Bridge模式

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)設計的類圖如下:

設計模式(五)【Bridge模式】Bridge模式

解決方案:引入抽象類Rectangle,V1Rectangle和V2Rectangle分别使用DP1和DP2引用實作。

2、需求變更

現在需要使用DP1和DP2增加支援另一種形狀Circle。

解決方案如下:

設計模式(五)【Bridge模式】Bridge模式

但是這個方法帶來的新的問題,考慮如下情況:

  • Shape類的具體類型有4中
  • 如果還有一種繪圖程式,那麼将産生具體類型6種
  • 如果還有一種圖形需要繪制,那麼将産生具體類型9種

于是爆炸性增長問題出現了。因為這個方案中的抽象與其實作是緊耦合的。每種形狀都必須知道自己使用了何種繪圖程式。需要有一種方式将抽象上的變化和實作上的變化分開。

Bridge模式

當存在一個抽象有不同實作時,Bridge模式最為适用,它可以是抽象和實作互相獨立地進行變化。

首先找到什麼在發生變化。上述問題裡,變化的是形狀的種類和繪圖程式的種類。共同概念是“形狀”和“繪圖程式”。

解決方案如下:

設計模式(五)【Bridge模式】Bridge模式

Shape類通過Drawing類具體實作自己的行為。

Bridge模式 關鍵特征
意圖 将一組實作與另一組使用它們的對象分離
問題 一個抽象類的派生類必須使用多個實作,但不能出現類的爆炸性增長
解決方案 為所有實作定義一個接口,供抽象類的所有派生類使用
參與者與協作者 AbStraction為要實作的對象定義接口,Implememtor為具體的實作類定義接口。Abstraction的派生類使用Implementor的派生類,但無需知道自己具體使用了哪一個ConcreteImplementor
效果 實作與使用的對象解耦,提供了可擴充性,客戶無需關注實作問題
實作

1、将實作封裝在抽象類中

2、在要實作的抽象類的基類彙總包含一個實作的句柄。注意:在Java中,你可以在實作中使用接口代替抽象類

設計模式(五)【Bridge模式】Bridge模式
參考《設計模式解析》第二版