你好!我們現在繼續深入研究一個廣泛且非常重要的有用主題:設計模式。今天我們就來說說橋接模式。與其他模式一樣,橋接模式用於解決開發人員在設計軟件架構時遇到的典型問題。今天讓我們來研究一下這個模式的特點,並了解如何使用它。

什麼是橋樑模式?

橋接模式是一種結構設計模式。換句話說,它的主要工作是從類和對像中創建一個成熟的結構。橋通過將一個或多個類劃分為單獨的層次結構來實現這一點:抽象實現。一個層次結構中功能的變化並不意味著另一個層次結構的變化。這很好,但是這個定義非常寬泛,沒有回答最重要的問題:“什麼是橋接模式?” 我想你會更容易理解它的實際應用。那麼馬上,讓我們為橋接模式創建一個經典場景。我們有一個抽像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具有三個實現的接口:BlackColor,GreenColorRedColor:
  • 顏色.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是連接兩個獨立的類層次結構的橋樑。

如何搭建一座橋樑:抽象與實現

讓我們看一個描述橋接模式的類圖: 橋樑設計模式介紹 - 2在這裡您可以看到兩個獨立的結構,它們可以修改而不會影響彼此的功能。在我們的例子中:
  • 抽象就是Shape
  • RefinedAbstraction 是TriangleRectangle
  • 實現者是Color接口
  • ConcreteImplementor 是BlackColor,GreenColorRedColor類。
該類Shape是一種抽象——一種管理用各種顏色填充形狀的機制,它委託給接口Color(實現者)。和類是使用類提供的機制的具體Triangle類。 ,並且是實現層次結構中的具體實現。RectangleShapeBlackColorGreenColorRedColor

在哪裡使用橋接模式

使用此模式的一個巨大好處是,您可以在不破壞另一個層次結構的邏輯的情況下更改一個層次結構中的功能類。此外,這種方法有助於減少類之間的耦合。使用此模式時的主要要求是“遵循說明”——不要忽略其中的任何一個!為此,讓我們弄清楚在什麼情況下你絕對應該使用橋接模式:
  1. 如果您需要根據兩個概念(例如形狀和顏色)的組合來擴展實體的數量。

  2. 如果你想把一個不符合單一職責原則的大類分成功能狹窄的小類。

  3. 如果需要在程序運行時對某些實體的邏輯進行更改。

  4. 如果有必要對類或庫的客戶端隱藏實現。

當您使用此模式時,請始終記住它會向您的代碼添加額外的實體——在只有一種形狀和一種或兩種可能顏色的項目中使用它可能沒有意義。

模式的優缺點

與其他模式一樣,橋既有優點也有缺點。 橋接模式的優點:
  1. 它提高了代碼的可擴展性——你可以添加功能而不用擔心破壞程序的其他部分。
  2. 當實體數量基於兩個概念(例如,形狀和顏色)的組合時,它減少了子類的數量。
  3. 它使得分別在兩個獨立的層次結構上工作成為可能——抽象和實現。兩個不同的開發人員可以在不深入研究彼此代碼細節的情況下進行更改。
  4. 它減少了類之間的耦合——兩個類唯一耦合的地方是橋(即域Color color)。
橋接模式的缺點:
  1. 根據具體情況和項目的整體結構,它可能會對程序的性能產生負面影響(例如,如果您需要初始化更多對象)。
  2. 由於需要在兩個類之間切換,它使代碼的可讀性降低。

與策略模式的區別

橋接模式經常與另一種設計模式——策略混淆。它們都使用組合(儘管我們在示例中使用圖形和顏色的聚合,橋接模式也可以使用組合),將工作委託給其他對象。但是它們之間是有區別的,而且是巨大的。策略模式是一種行為模式:它解決的是完全不同的問題。Strategy 允許算法互換,而 bridge 將抽象與實現分開,以便在不同的實現之間進行選擇。換句話說,與策略不同,橋樑適用於整個實體或層次結構。橋接模式可以成為開發人員武器庫中的好武器。最主要的是確定值得使用它的情況,並識別何時其他模式是合適的。