【橋接設計模式詳解】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();
更多語言版本
不同語言實現設計模式程式碼大全,不斷更新中,敬請關注: