橋接模式屬於結構型設計模式,它通過提供抽象化和實現化之間的橋接結構來實現二者的解耦。
定義:將抽象和實現解耦,使兩者可以獨立變化。
問題描述:在軟體系統中,某些類由於自身的邏輯,它具有兩個或多個維度的變化,其中乙個發生變化會導致整個類發生變化,那麼我們該如何應對這種「多維度的變化」,讓該型別能夠輕鬆地沿著多個方向進行變化,又不引入額外的複雜度呢?
解決方案:適用橋接模式,將這兩個或多個維度分離出來,使兩者可以獨立擴充套件。
結構圖:
舉個栗子:將乙個關於蠟筆的故事。。。
我們現有大中小3三種型號的蠟筆,每種型號的蠟筆均能繪製12種不同的顏色,那麼如果現在要增加一種新型號的蠟筆,並且也需要具有12種顏色,也就是增加了12支蠟筆,如此顏色和型號兩個不同的變化維度融合在一起,無論是對顏色進行擴充套件還是對型號進行擴充套件都勢必會影響到另乙個維度,這樣在蠟筆中顏色和型號之間存在較強的耦合,那麼橋接模式就是來對顏色和型號進行解耦的。具體實現方式如下:
1. 新增乙個實現了介面colorimp的顏色類redcolor,yellowcolor和bluecolor。**如下:
yellowcolor和bluecolor類似,此處省略。
2. 新增乙個實現了介面modelimp的型號類bigmodel、middlemodel和smallmodel。**如下:
bigmodel和smallmodel類似,此處省略。
3. 新增乙個抽象類penabstraction,定義該抽象類的行為(指定蠟筆的型別和顏色),並儲存對例項化角色的引用,分別宣告modelimp介面和colorimp介面的物件。**如下:
4. 新增乙個具體實現類crayon,繼承上面的抽象類penabstraction,實現在penabstraction中宣告的抽象業務方法。**如下:
5. 在類bridgefragment中通過類crayon的例項化物件來實現功能。**如下:
6. 執行後的效果,如圖所示:
綜上所述,型別和顏色是蠟筆中兩個獨立變化的維度,我給這兩個維度都提供了抽象層,並在抽象部分penabstraction建立抽象耦合,這樣就將抽象部分和它的實現部分分離了,型別和顏色可以獨立地變化,客戶端可以隨意替換或增加型別和顏色,兩者之間互不影響,且不用修改原有的結構。
優點:分離抽象介面及其實現部分,實現解耦;提高了可擴充套件性,可以任意擴充套件其中乙個維度,不需要修改原有系統,符合開閉原則。
缺點:正確識別系統中獨立變化的維度的時候存在一定的難度,並且增加系統的理解與設計難度。
適用場景:
1. 乙個類存在兩個或者多個獨立變化的維度,且這兩個或多個維度都需要獨立進行擴充套件的時候;
2. 需要在抽象化和具體化之間增加更多的靈活性,避免它們之間建立靜態的繼承關係的時候;
3. 需要對抽象化角色和實現話角色進行動態耦合的時候;
3. 不希望使用繼承或多繼承導致系統類的個數急劇增加的時候。
設計模式之橋接模式
public class test 兩個維度 乙個是具體產品,如狗 豬 乙個是抽象產品,如溫順的動物 冷酷的動物 排列組合 如溫順的狗 冷酷的豬等 abstract class animal 該橋接類的引入是關鍵 abstract class animalbridge extends animal ...
設計模式之 橋接模式
今天來學習橋接模式,在我們日常生活中,有很多的事物是可以 多維度 的變化的,比如我們去吃麵條,有雞絲面和牛肉麵兩種,每一種面又分為辣味的和不辣的,而且每種面可能會分為大碗小碗的。很多事物能夠變化的維度不止一種,甚至數十種,那麼我們在 上怎麼應對這些變化呢?每乙個都單獨弄乙個類顯然不是什麼好辦法。那麼...
設計模式之橋接模式
在軟體系統中,某些型別由於自身的邏輯,它具有兩個或多個維度的變化,那麼如何應對這種 多維度的變化 如何利用物件導向的技術來使得該型別能夠輕鬆的沿著多個方向進行變化,而又不引入額外的複雜度?這就要使用橋接模式。現在有咖啡,按大小分可以分為中杯和大杯,按型別可以分為拿鐵和摩卡,所以現在總共有四中咖啡,中...