【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現 簡介 橋接模式(Bridge Pattern)是一種結構型設計模式,它將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構,來實現二者的解耦。參與橋接的介面是穩定的,用戶可以擴展和修改橋接中的類,但是不能改變介面。 ...
【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現
簡介
橋接模式(Bridge Pattern)是一種結構型設計模式,它將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構,來實現二者的解耦。參與橋接的介面是穩定的,用戶可以擴展和修改橋接中的類,但是不能改變介面。橋接模式通過介面繼承實現或者類繼承實現功能擴展。
如果你希望在幾個獨立維度上擴展一個類,或者你想要拆分、重組一個具有多重功能的複雜類(例如能與多個資料庫伺服器進行交互的類),或者你想在運行時切換不同的實現方法,可以使用橋接模式。
作用
- 在有多種可能會變化的情況下,用繼承擴展起來不靈活,橋接可以解決類似問題。
- 橋接模式提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。
實現步驟
- 定義一個工具介面,供不同工具類來實現。
- 建立多個具體工具類實現基礎工具介面,這些工具是負責具體能力實現。
- 定義一個基礎抽象類,裡面聚合了工具介面,相當於橋接器。
- 建立具體對象類,繼承自基礎抽象類,調用工具類里的方法來實現具體功能。
UML
代碼
基礎抽象類
// AbstractShape.java 定義抽象橋接器,關聯圖形操作介面 public abstract class AbstractShape {s protected DrawTool drawTool; protected AbstractShape(DrawTool drawTool) { this.drawTool = drawTool; } public abstract void draw(int x, int y, int radius); }
具體橋接器實現類
// RefinedShape.java 具體橋接類,繼承抽象橋接類,擴充了自己的方法 public class RefinedShape extends AbstractShape { public RefinedShape(DrawTool drawTool) { super(drawTool); } @Override public void draw(int x, int y, int radius) { System.out.println(String.format("RefinedShape::draw() [x=%s y=%s radius=%s]", x, y, radius)); // 通過工具類實際繪製 drawTool.drawStyle(); } // 新增的方法,可作為工具類的補充 public void drawDone() { System.out.println("RefinedShape::drawDone(), 執行的drawTool是: " + drawTool.getClass().getSimpleName()); } }
定義工具介面類
// DrawTool.java 圖形操作基礎介面 public interface DrawTool { public void drawStyle(); }
定義工具實現類,可以多個
```java // DrawStyleA.java 畫圓A,實現了圖畫基礎API public class DrawStyeA implements DrawTool { @Override public void drawStyle() { System.out.println("DrawStyleA:drawStyle()"); } } ``` ```java // 畫圓B,實現了圖畫基礎API public class DrawStyleB implements DrawTool { @Override public void drawStyle() { System.out.println("DrawStyleB:drawStyle()"); } }
測試調用
/** * 橋接模式是將基礎抽象類作為橋接器,用來連接業務對象和具體動作,將兩者充分解耦。 * 具體對象以抽象對象為父類,實現父類方法。 * 具體工具類實現統一的工具介面,為抽象橋接對象服務 * 使用時,聲明具體對象同時傳入具體工具,使得具體對象可以使用具體工具的動作。 */ // 用抽象類來聲明具體對象,並指定具體工具 AbstractShape shape = new RefinedShape(new DrawStyeA()); // 調用對象的方法,裡面執行了工具類的方法 shape.draw(10, 20, 50); RefinedShape shape1 = (RefinedShape) shape; // 類型強轉為具體業務類,調用具體類的方法 shape1.drawDone(); // /*********************** 分割線 ******************************************/ // 直接用具體類來聲明對象,並指定另外的工具 RefinedShape shape2 = new RefinedShape(new DrawStyleB()); // 調用對象的方法,裡面執行了工具類的方法 shape2.draw(11, 22, 33); shape2.drawDone();
更多語言版本
不同語言實現設計模式代碼大全,不斷更新中,敬請關註:
https://github.com/microwind/design-pattern