你好!我們繼續了解一個廣泛且非常有用的主題—設計模式。今天我們就來談談橋。與其他模式一樣,Bridge 旨在解決開發人員在設計軟體架構時面臨的常見問題。今天我們就來研究它的特性並了解如何使用它。
什麼是橋接模式?
橋接模式是一種結構設計模式。也就是說,它的主要任務是創建一個完整的類別和物件結構。Bridge 透過將一個或多個類別分成單獨的層次結構(抽象和實作)來解決這個問題。一個層次結構中功能的改變不會造成另一層次結構中功能的改變。一切看起來都很清楚,但事實上這個定義聽起來很寬泛,並沒有回答主要問題:“什麼是橋接模式?” 我認為這對你來說在實踐中會更容易理解。讓我們立即為橋接模式建立一個經典範例。我們有一個抽象類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(); }
-
BlackColor.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
- 實施分支中的具體實施。它們通常被稱為平台。
橋接模式用在哪裡?
使用此模式的一個巨大優點是,您可以更改一個分支中的類別的功能,而不會破壞另一個分支的邏輯。這種方法也有助於減少程式類別的耦合。使用圖案的主要條件是“遵循說明”:不要將它們粘在任何地方!實際上,讓我們弄清楚在什麼情況下你肯定需要使用 Bridge:-
如果需要在兩個方向(幾何形狀、顏色)擴展實體數量。
-
如果您想將不符合單一責任原則的大類別劃分為具有窄配置功能的較小類別。
-
如果程式運行時可能需要更改某些實體的操作邏輯。
-
如有必要,對類別(庫)客戶端隱藏實作。
該模式的優點和缺點
與其他模式一樣,橋接模式既有優點也有缺點。 橋的好處:- 提高程式碼可擴充性 - 您可以新增功能,而不必擔心破壞程式其他部分的某些內容。
- 減少子類別的數量 - 當需要在兩個方向上擴展實體的數量(例如,形狀的數量和顏色的數量)時有效。
- 使得可以分別在抽象和實現的兩個獨立分支上工作——這可以由兩個不同的開發人員完成,而無需深入研究彼此程式碼的細節。
- 減少類別的耦合-兩個類別唯一連接的地方就是橋(字段
Color color
)。
- 根據具體情況和整個專案的結構,可能會對程式生產力產生負面影響(例如,如果需要初始化更多物件)。
- 由於需要在類別之間導航,因此使程式碼可讀性變得複雜。
GO TO FULL VERSION