【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現

来源:https://www.cnblogs.com/letjs/archive/2023/03/11/17205156.html
-Advertisement-
Play Games

【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現 簡介 橋接模式(Bridge Pattern)是一種結構型設計模式,它將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構,來實現二者的解耦。參與橋接的介面是穩定的,用戶可以擴展和修改橋接中的類,但是不能改變介面。 ...


【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現

 

簡介

橋接模式(Bridge Pattern)是一種結構型設計模式,它將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構,來實現二者的解耦。參與橋接的介面是穩定的,用戶可以擴展和修改橋接中的類,但是不能改變介面。橋接模式通過介面繼承實現或者類繼承實現功能擴展。

如果你希望在幾個獨立維度上擴展一個類,或者你想要拆分、重組一個具有多重功能的複雜類(例如能與多個資料庫伺服器進行交互的類),或者你想在運行時切換不同的實現方法,可以使用橋接模式。

 

作用

  1. 在有多種可能會變化的情況下,用繼承擴展起來不靈活,橋接可以解決類似問題。
  2. 橋接模式提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。

 

實現步驟

  1. 定義一個工具介面,供不同工具類來實現。
  2. 建立多個具體工具類實現基礎工具介面,這些工具是負責具體能力實現。
  3. 定義一個基礎抽象類,裡面聚合了工具介面,相當於橋接器。
  4. 建立具體對象類,繼承自基礎抽象類,調用工具類里的方法來實現具體功能。

 

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Redis(REmote DIctionary Service)是一個開源的鍵值對資料庫伺服器。 Redis 更準確的描述是一個數據結構伺服器。Redis 的這種特殊性質讓它在開發人員中很受歡迎。 ...
  • 前言 今天我們來解密下init.ts中的代碼內容,並結合 vue 生命周期來分析下 vue 的初始化; GitHub github page 內容 init.ts import config from '../config' import { initProxy } from './proxy' i ...
  • 好家伙,本篇為《JS高級程式設計》第二五章“瀏覽器存儲”學習筆記 我們先來講個故事 一個“薅羊毛”的故事 (qq.com) 概括一下,就是 有個人通過網路平臺非法購買了大量“cookie”數據。 突破平臺封控,冒用他人新用戶身份,非法騙取新用戶優惠券。 拿著優惠券低價購入商品,隨後轉賣並從中賺取差價 ...
  • three.js、webgl、3D消防、智慧消防、三維消防、使用three.js(webgl)搭建智慧樓宇消防、3D園區、3D廠房、3D倉庫、設備檢測、數字孿生、物聯網3D、物業3D監控、物業基礎設施可視化運維、3d建築,3d消防,消防演習模擬,3d庫房,webGL,threejs,3d機房,bim... ...
  • 在前端開發中,策略模式是一種常用的設計模式,它可以讓我們在不改變對象本身的情況下,通過修改其內部的演算法實現不同的行為。策略模式常常被用於實現一些複雜的業務邏輯,特別是需要根據不同的條件進行處理的情況。 下麵是一個簡單的示例,演示瞭如何使用策略模式來實現一個計算器: // 定義一個策略對象 const ...
  • 這篇文章主要描述非同步設計,非同步是一種程式設計的思想,使用非同步模式設計的程式可以顯著減少線程等待,從而在高吞吐量的場景中,極大提升系統的整體性能,降低請求時延。 ...
  • 要 在大數據,雲計算,人工智慧盛行的環境下,程式員該何去何從?企業自有的研發團隊又該如何規劃?這兩個問題在五年前,我就認真的思考和深入的分析過。程式開發模式基本經歷了以下階段。 傳統的程式開發階段 在對需求進行調研和分析後,最終得到系統的設計架構和技術選型;接下來就是程式員從第一行代碼純手工的編寫, ...
  • 這篇文章主要描述如何解決消息重發的問題,目前主流的消息隊列產品都採用了At least once的服務質量,這就導致了很難避免消息重發的情況,我們可以將消費者業務邏輯設計成冪等服務來解決消息重發問題。 ...
一周排行
    -Advertisement-
    Play Games
  • .NET Core 選項系統的主要實現在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtensions 兩個 Nuget 包。對於一個框架的源碼進行解讀,我們可以從我們常用的框架中的類或方法入手 ...
  • 最近在工作中遇到一個問題,就是我有多個線程會調用bitmap對象,運行的時候報錯,對象當前正在其他地方使用。第一反應肯定是加鎖啊,於是我就在每個用到bitmap的地方都加了鎖,但是運行之後依然報這個錯 測試代碼如下 using System; using System.Drawing; using ...
  • 一:背景 1. 講故事 前段時間有位朋友微信找到我,說他的程式使用 hsl 庫之後,採集 plc 時記憶體溢出,讓我幫忙看一下怎麼回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 說話吧。 二:WinDbg 分析 1. 為什麼會記憶體溢出 簡單觀察程式的提交記憶體之 ...
  • 在 IIS 上啟用 Websocket 在 Windows Server 2012 或更高版本上啟用對 WebSocket 協議的支持: 備註 使用 IIS Express 時無需執行這些步驟 通過“管理”菜單或“伺服器管理器”中的鏈接使用“添加角色和功能”嚮導。 選擇“基於角色或基於功能的安裝”。 ...
  • C#-垃圾回收機制(GC) 什麼是GC 官網中有這麼一句話: The garbage collector is a common language runtime component that controls the allocation and release of managed memory ...
  • 呆了2個大屏行業的公司,對大屏幕有一些瞭解,所以整理下所瞭解的觸摸屏相關概念。方便自己以及進入這個行業的小伙伴們,能有個系統、快速的認知。 觸摸屏詳細的知識點,網上其實都有。整理資料過程中,我也瞭解了更多的觸摸屏知識,像聲波屏、光學屏之類的之前就沒接觸。下麵分不同的模塊,給大家介紹 交互觸摸屏類型 ...
  • 近段時間忙於各種項目和對【易排平臺】的優化,沒顧得上分享APS相關的小技巧,回頭看看小公眾號的關註人數早已達1500+,在此爭取時間寫一下這段時間在項目上及平臺優化過程中遇到的一些小技巧,以感謝諸位的關註。過去數月的解決的問題中,涉及最多的是規劃模型中,實現各種時間維度的功能,目前在平臺上也稍有成果 ...
  • 針對大量log日誌快速定位錯誤地方 動態查看日誌 tail -f catalina.ou 從頭打開日誌文件 cat catalina.ou 可以使用 >nanjiangtest.txt 輸出某個新日誌去查看 [[email protected] logs]# cat -n catalina.out |grep 7 ...
  • 前言 RocketMQ是阿裡巴巴旗下一款開源的MQ框架,經歷過雙十一考驗、Java編程語言實現,有非常好完整生態系統。RocketMQ作為一款純java、分散式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等 本篇文章第一部分屬於一些核心概念和工作流程的講解;第二部 ...
  • 在java,c#類的成員修飾符包括,公有、私有、程式集可用的、受保護的。 對於python來說,只有兩個成員修飾符:公有成員,私有成員 成員修飾符是來修飾誰呢?當然是修飾成員了。那麼python類的成員包括什麼呢? python成員: 欄位,方法,屬性 每個類成員的修飾符有兩種: 公有成員:內部外部 ...