JavaRush /Java Blog /Random-TW /橋樑設計模式

橋樑設計模式

在 Random-TW 群組發布
你好!我們繼續了解一個廣泛且非常有用的主題—設計模式。今天我們就來談談橋。與其他模式一樣,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(),我們需要為與顏色相對應的每個形狀建立一個類別。如果有三種顏色,則有六個類別:TriangleBlackTriangleGreenTriangleRedRectangleBlackRectangleGreenRectangleRed六堂課並不是什麼大不了的事。但!如果我們需要添加新的形狀或顏色,類別的數量將呈指數級增長。如何擺脫這種困境?在欄位中儲存顏色並透過條件嘗試選項並不是最好的解決方案。一個好的解決方案是在單獨的介面中顯示顏色。說到做到:讓我們建立一個介面Color及其三個實作 - BlackColorGreenColorRedColor
  • 顏色.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是互連兩個獨立的類別層次結構的橋樑。

橋接設備:什麼是抽象與實現

讓我們來看看描述橋接模式的類別圖: Bridge 設計模式簡介 - 2在這裡您可以看到兩個獨立的結構,可以修改它們而不影響彼此的功能。在我們的例子中是:
  • 抽象類別Shape
  • RefinedAbstraction - 類TriangleRectangle
  • 實現者-接口Color
  • ConcreteImplementor-類BlackColorGreenColorRedColor
這個類別Shape代表一個抽象 - 一種用於控制不同顏色的形狀著色的機制,它將實現委託給介面Color。類別TriangleRectangle使用類別提供的機制的真實物件ShapeBlackColorGreenColor以及RedColor- 實施分支中的具體實施。它們通常被稱為平台。

橋接模式用在哪裡?

使用此模式的一個巨大優點是,您可以更改一個分支中的類別的功能,而不會破壞另一個分支的邏輯。這種方法也有助於減少程式類別的耦合。使用圖案的主要條件是“遵循說明”:不要將它們粘在任何地方!實際上,讓我們弄清楚在什麼情況下你肯定需要使用 Bridge:
  1. 如果需要在兩個方向(幾何形狀、顏色)擴展實體數量。

  2. 如果您想將不符合單一責任原則的大類別劃分為具有窄配置功能的較小類別。

  3. 如果程式運行時可能需要更改某些實體的操作邏輯。

  4. 如有必要,對類別(庫)客戶端隱藏實作。

每次使用模式時,您需要記住它會在程式碼中添加額外的實體 - 在只有一個幾何圖形和一兩種可能的顏色的項目中使用它並不完全符合邏輯。

該模式的優點和缺點

與其他模式一樣,橋接模式既有優點也有缺點。 橋的好處:
  1. 提高程式碼可擴充性 - 您可以新增功能,而不必擔心破壞程式其他部分的某些內容。
  2. 減少子類別的數量 - 當需要在兩個方向上擴展實體的數量(例如,形狀的數量和顏色的數量)時有效。
  3. 使得可以分別在抽象和實現的兩個獨立分支上工作——這可以由兩個不同的開發人員完成,而無需深入研究彼此程式碼的細節。
  4. 減少類別的耦合-兩個類別唯一連接的地方就是橋(字段Color color)。
橋接的缺點:
  1. 根據具體情況和整個專案的結構,可能會對程式生產力產生負面影響(例如,如果需要初始化更多物件)。
  2. 由於需要在類別之間導航,因此使程式碼可讀性變得複雜。

與策略模式的區別

橋接模式經常與另一種設計模式「策略」混淆。它們都透過將工作委託給其他物件來使用組合(在形狀和顏色範例中我們使用聚合,但橋接模式也可以使用組合)。但他們之間是有差別的,而且是巨大的。策略模式是一種行為模式:它解決完全不同的問題。策略允許演算法可以互換,而橋則將抽象與實作分開,以允許在不同的實作之間進行選擇。也就是說,與策略不同,橋接適用於整個構造或層次結構。橋接模式可以成為開發人員武器庫中的一個好武器;主要是找到值得使用它的情況,或使用其他模式。如果您還不熟悉其他模板,請閱讀以下材料:
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION