1. 程式人生 > >設計模式總結之Bridge Pattern(橋接模式)

設計模式總結之Bridge Pattern(橋接模式)

目錄

建立型設計模式: 結構型設計模式: 行為型設計模式:

Bridge Pattern(橋接模式)

意圖

將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

【GOF95】在提出橋樑模式的時候指出,橋樑模式的用意是"將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化"。這句話有三個關鍵詞,也就是抽象化、實現化和脫耦。

* 抽象化
存在於多個實體中的共同的概念性聯絡,就是抽象化。作為一個過程,抽象化就是忽略一些資訊,從而把不同的實體當做同樣的實體對待【LISKOV94】。
* 實現化
抽象化給出的具體實現,就是實現化。
* 脫耦
所謂耦合,就是兩個實體的行為的某種強關聯。而將它們的強關聯去掉,就是耦合的解脫,或稱脫耦。在這裡,脫耦是指將抽象化和實現化之間的耦合解脫開,或者說是將它們之間的強關聯改換成弱關聯。

將兩個角色之間的繼承關係改為聚合關係,就是將它們之間的強關聯改換成為弱關聯。因此,橋樑模式中的所謂脫耦,就是指在一個軟體系統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使兩者可以相對獨立地變化。這就是橋樑模式的用意。

結構



橋樑模式所涉及的角色有:
抽象化(Abstraction)角色:抽象化給出的定義,並儲存一個對實現化物件的引用。
修正抽象化(Refined Abstraction)角色:擴充套件抽象化角色,改變和修正父類對抽象化的定義。
實現化(Implementor)角色:這個角色給出實現化角色的介面,但不給出具體的實現。必須指出的是,這個接 口不一定和抽象化角色的介面定義相同,實際上,這兩個介面可以非常不一樣。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層 的操作。
具體實現化(Concrete Implementor)角色:這個角色給出實現化角色介面的具體實現。

例子

一個表就一個錶帶?


還是,一個表+多個可更換的錶帶?







橋接模式和介面卡模式的區別

很多時候經常容易把橋接模式和介面卡模式弄混。那什麼時候用橋接,什麼時候用介面卡呢 ?  

共同點:
橋接和介面卡都是讓兩個東西配合工作 

不同點:出發點不同。          
  介面卡:改變已有的兩個介面,讓他們相容。  
  橋接模式:分離抽象化和實現,使兩者的介面可以不同,目的是分離。  

所以說,如果你拿到兩個已有模組,想讓他們同時工作,那麼你使用的介面卡。 如果你還什麼都沒有,但是想分開實現,那麼橋接是一個選擇。  


橋接是先有橋,才有兩端的東西 適配是先有兩邊的東西,才有介面卡 。
橋接是在橋好了之後,兩邊的東西還可以變化。 

橋模式並不同於介面卡模式,介面卡模式其實是一個事後諸葛亮,當發現以前的東西不適用了才去做一個彌補的措施。橋模式相對來說所做的改變比介面卡模式早,它可以適用於有兩個甚至兩個以上維度的變化。

橋接模式將繼承關係轉換為關聯關係,從而降低了類與類之間的耦合,減少了程式碼編寫量。