你好!我們現在繼續深入研究一個廣泛且非常重要的有用主題:設計模式。今天我們就來說說橋接模式。與其他模式一樣,橋接模式用於解決開發人員在設計軟件架構時遇到的典型問題。今天讓我們來研究一下這個模式的特點,並了解如何使用它。
什麼是橋樑模式?
橋接模式是一種結構設計模式。換句話說,它的主要工作是從類和對像中創建一個成熟的結構。橋通過將一個或多個類劃分為單獨的層次結構來實現這一點:抽象和實現。一個層次結構中功能的變化並不意味著另一個層次結構的變化。這很好,但是這個定義非常寬泛,沒有回答最重要的問題:“什麼是橋接模式?” 我想你會更容易理解它的實際應用。那麼馬上,讓我們為橋接模式創建一個經典場景。我們有一個抽像Shape
類,它代表一個通用的幾何圖形:
-
形狀.java
public abstract class Shape { public abstract void draw(); }
當我們決定添加像三角形和矩形這樣的形狀時,我們會讓它們繼承類
Shape
: -
矩形.java:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
三角形.java:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
將取決於這種顏色。為了有不同的draw()
方法實現,我們需要為每個形狀-顏色組合創建一個類。如果我們有三種顏色,那麼我們需要六個類別:TriangleBlack
、TriangleGreen
、TriangleRed
、RectangleBlack
和RectangleGreen
。RectangleRed
六節課不是什麼大問題。但!如果我們需要添加新的形狀或顏色,那麼類的數量會呈指數增長。如何擺脫這種情況?將顏色存儲在字段中並使用條件語句枚舉所有選項並不是最佳解決方案。一個好的解決方案是將顏色移動到單獨的界面. 說到做到:讓我們創建一個Color
具有三個實現的接口:BlackColor
,GreenColor
和RedColor
:
-
顏色.java:
public interface Color { void fillColor(); }
-
黑顏色.java:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
綠顏色.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
紅顏色.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
Color
現在我們向類中添加一個字段Shape
。我們將在構造函數中獲取它的值。 -
形狀.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
我們將在實現中使用該變量Shape
。這意味著形狀現在可以使用界面的功能Color
。 -
矩形.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
是連接兩個獨立的類層次結構的橋樑。
如何搭建一座橋樑:抽象與實現
讓我們看一個描述橋接模式的類圖: 在這裡您可以看到兩個獨立的結構,它們可以修改而不會影響彼此的功能。在我們的例子中:- 抽象就是
Shape
類 - RefinedAbstraction 是
Triangle
和Rectangle
類 - 實現者是
Color
接口 - ConcreteImplementor 是
BlackColor
,GreenColor
和RedColor
類。
Shape
是一種抽象——一種管理用各種顏色填充形狀的機制,它委託給接口Color
(實現者)。和類是使用類提供的機制的具體Triangle
類。 ,並且是實現層次結構中的具體實現。Rectangle
Shape
BlackColor
GreenColor
RedColor
在哪裡使用橋接模式
使用此模式的一個巨大好處是,您可以在不破壞另一個層次結構的邏輯的情況下更改一個層次結構中的功能類。此外,這種方法有助於減少類之間的耦合。使用此模式時的主要要求是“遵循說明”——不要忽略其中的任何一個!為此,讓我們弄清楚在什麼情況下你絕對應該使用橋接模式:-
如果您需要根據兩個概念(例如形狀和顏色)的組合來擴展實體的數量。
-
如果你想把一個不符合單一職責原則的大類分成功能狹窄的小類。
-
如果需要在程序運行時對某些實體的邏輯進行更改。
-
如果有必要對類或庫的客戶端隱藏實現。
模式的優缺點
與其他模式一樣,橋既有優點也有缺點。 橋接模式的優點:- 它提高了代碼的可擴展性——你可以添加功能而不用擔心破壞程序的其他部分。
- 當實體數量基於兩個概念(例如,形狀和顏色)的組合時,它減少了子類的數量。
- 它使得分別在兩個獨立的層次結構上工作成為可能——抽象和實現。兩個不同的開發人員可以在不深入研究彼此代碼細節的情況下進行更改。
- 它減少了類之間的耦合——兩個類唯一耦合的地方是橋(即域
Color color
)。
- 根據具體情況和項目的整體結構,它可能會對程序的性能產生負面影響(例如,如果您需要初始化更多對象)。
- 由於需要在兩個類之間切換,它使代碼的可讀性降低。
GO TO FULL VERSION