【橋接設計模式詳解】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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/546497.html
標籤:設計模式
上一篇:如何正確理解并科學實踐DDD
