設計模式-發布訂閱

文章目錄

  • 發布訂閱概念
    • 發布訂閱 vs 監聽者
    • 例子代碼

發布訂閱概念

在這里插入圖片描述

發布/訂閱者模式最大的特點就是實現了松耦合,也就是說你可以讓發布者發布消息、訂閱者接受消息,而不是尋找一種方式把兩個分離 的系統連接在一起。當然這種松耦合也是發布/訂閱者模式最大的缺點,因為需要中間的代理,增加了系統的復雜度。而且發布者無法實時知道發布的消息是否被每個訂閱者接收到了,增加了系統的不確定性。

在這里插入圖片描述

發布訂閱 vs 監聽者

參考文章:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c, 理解發布訂閱模式和觀察者模式的區別

Let’s list out the differences as a quick Summary:

  • In the Observer pattern, the Observers are aware of the Subject, also the Subject maintains a record of the Observers. Whereas, in Publisher/Subscriber, publishers and subscribers don’t need to know each other. They simply communicate with the help of message queues or broker.

  • In Publisher/Subscriber pattern, components are loosely coupled as opposed to Observer pattern.

  • Observer pattern is mostly implemented in a synchronous way, i.e. the Subject calls the appropriate method of all its observers when some event occurs. The Publisher/Subscriber pattern is mostly implemented in an asynchronous way (using message queue).

  • Observer pattern needs to be implemented in a single application address space. On the other hand, the Publisher/Subscriber pattern is more of a cross-application pattern.

發布訂閱解偶,通常使用消息中間件,能實現跨平臺、異步通信

例子代碼

  • 發布者發布消息
public interface Publisher {// 發布消息void publishMessage(String msg);}
  • 訂閱者訂閱并響應消息
public interface Subscriber {// 進行訂閱void subscribe();// 響應消息void onMessage(String message);
}
  • 第三方中間件做消息中轉并通知訂閱者
public class Broker {List<Subscriber> subscriberList = new ArrayList<>();List<Publisher> publishList = new ArrayList<>();List<String> messageList = new ArrayList<>();public void notifySubscribers(){while(!messageList.isEmpty()){String message = messageList.remove(0);for(Subscriber subscriber :subscriberList){subscriber.onMessage(message);}}}public void publishMessage(String message){messageList.add(message);}public void subscribt(Subscriber subscriber){subscriberList.add(subscriber);}public void publish(Publisher publisher){publishList.add(publisher);}public static void main(String[] args) {// 發布訂閱中心, 消息中間件一樣Broker broker = new Broker();// 發布者注冊Publisher1 publisher = new Publisher1();publisher.setBroker(broker);// 訂閱者注冊Subscriber1 subscriber = new Subscriber1();subscriber.setBroker(broker);subscriber.subscribe();// 發布者發布消息publisher.publishMessage("hello");// 中間間會通知所有訂閱者broker.notifySubscribers();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82880.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows-cmd 如何查詢cpu、內存、磁盤的使用情況

在 Windows 中&#xff0c;您可以使用命令提示符&#xff08;CMD&#xff09;通過一些命令來查詢 CPU、內存和磁盤的使用情況。以下是常用的命令和方法&#xff1a; 1. 查詢 CPU 使用情況 使用 wmic 命令 wmic cpu get loadpercentage 這個命令會顯示當前 CPU 的使用百分比…

allWebPlugin中間件VLC專用版之截圖功能介紹

背景 VLC控件原有接口具有視頻截圖方法&#xff0c;即video對象的takeSnapshot方法&#xff0c;但是該方法返回的是一個IPicture對象&#xff0c;不適合在谷歌等現代瀏覽器上使用。因此&#xff0c;本人增加一個新的視頻截圖方法takeSnapshot2B64方法&#xff0c;直接將視頻截圖…

第Y5周:yolo.py文件解讀

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 本次任務&#xff1a;將YOLOv5s網絡模型中的C3模塊按照下圖方式修改形成C2模塊&#xff0c;并將C2模塊插入第2層與第3層之間&#xff0c;且跑通YOLOv5s。 任務…

寶塔安裝ssh證書報錯:/usr/bin/curl: symbol lookup error: curl_easy_header

原因&#xff1a; 你當前的 curl 命令版本是 7.70.0&#xff08;不是系統默認版本&#xff0c;應該是你手動安裝的&#xff09;。它鏈接的是 /usr/local/lib/libcurl.so.4&#xff0c;而不是 CentOS 系統默認的 /usr/lib64/libcurl.so.4。/usr/local/lib/libcurl.so.4 很可能是…

Apache SeaTunnel 引擎深度解析:原理、技術與高效實踐

Apache SeaTunnel 作為新一代高性能分布式數據集成平臺&#xff0c;其核心引擎設計融合了現代大數據處理架構的精髓。 Apache SeaTunnel引擎通過分布式架構革新、精細化資源控制及企業級可靠性設計&#xff0c;顯著提升了數據集成管道的執行效率與運維體驗。其模塊化設計允許用…

測試用例及黑盒測試方法

一、測試用例 1.1 基本要素 測試用例&#xff08;Test Case&#xff09;是為了實施測試而向被測試的系統提供的一組集合&#xff0c;這組集合包含&#xff1a;測試環境、操作步驟、測試數據、預期結果等4個主要要素。 1.1.1 測試環境 定義&#xff1a;測試執行所需的軟硬件…

硬件工程師筆記——運算放大電路Multisim電路仿真實驗匯總

目錄 1 運算放大電路基礎 1.1 概述 1.1.1 基本結構 1.1.2 理想特性 1.2 運算放大分析方法 1.2.1 虛短 1.2.2虛斷 1.2.3 疊加定理 2 同向比例運算放大電路 2.1 概述 2.1.1 基本電路結構 2.1.2 電路原理 2.2 仿真分析 2.2.1 電壓增益 2.2.2 相位分析 3 反向比例運…

板凳-------Mysql cookbook學習 (九)

第4章&#xff1a;表管理 4.0 引言 MySQL &#xff1a;&#xff1a; 員工樣例數據庫 &#xff1a;&#xff1a; 3 安裝 https://dev.mysql.com/doc/employee/en/employees-installation.html Employees 數據庫與幾種不同的 存儲引擎&#xff0c;默認情況下啟用 InnoDB 引擎。編…

MySQL省市區數據表

數據結構簡單展示一下 具體的可以點擊文章最后的鏈接地址下載 連接地址中有兩個文件一個是詳細的另一個是簡潔的 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for ln_new_region -- ---------------------------- DROP…

無人機報警器探測模塊技術解析!

一、運行方式 1. 頻譜監測與信號識別 全頻段掃描&#xff1a;模塊實時掃描900MHz、1.5GHz、2.4GHz、5.8GHz等無人機常用頻段&#xff0c;覆蓋遙控、圖傳及GPS導航信號。 多路分集技術&#xff1a;采用多傳感器陣列&#xff0c;通過信號加權合并提升信噪比&#xff0c;…

Oracle 導入導出 dmp 數據文件實戰

一、DMP文件基礎知識?? 1. ??DMP文件定義?? DMP&#xff08;Data Pump Dump File&#xff09;是Oracle數據庫專用的二進制格式文件&#xff0c;由expdp/impdp或舊版exp/imp工具生成。它包含數據庫對象的元數據&#xff08;表結構、索引等&#xff09;和實際數據&#x…

Coursier:安裝sbt

命令 ./cs launch sbt -- --version 的含義是??通過 Coursier&#xff08;cs&#xff09;工具啟動 SBT&#xff08;Scala 構建工具&#xff09;&#xff0c;并查詢其版本信息??。具體解析如下&#xff1a; ??1. 命令結構解析?? ??./cs??&#xff1a; 這是 Coursie…

【深度學習】12. VIT與GPT 模型與語言生成:從 GPT-1 到 GPT4

VIT與GPT 模型與語言生成&#xff1a;從 GPT-1 到 GPT4 本教程將介紹 GPT 系列模型的發展歷程、結構原理、訓練方式以及人類反饋強化學習&#xff08;RLHF&#xff09;對生成對齊的改進。內容涵蓋 GPT-1、GPT-2、GPT-3、GPT-3.5&#xff08;InstructGPT&#xff09;、ChatGPT …

項目更改權限后都被git標記為改變,怎么去除

?問題描述&#xff1a; 當你修改了項目中的文件權限&#xff08;如使用 chmod 改了可執行權限&#xff09;&#xff0c;Git 會把這些文件標記為“已更改”&#xff0c;即使內容并沒有發生任何改變。 ? 解決方法&#xff1a; ? 方法一&#xff1a;告訴 Git 忽略權限變化&am…

openfeignFeign 客戶端禁用 SSL

要針對特定的 Feign 客戶端禁用 SSL 驗證&#xff0c;可以通過自定義配置類實現。以下是完整解決方案&#xff1a; 1. 創建自定義配置類&#xff08;禁用 SSL 驗證&#xff09; import feign.Client; import feign.httpclient.ApacheHttpClient; import org.apache.http.conn…

移動端 UI自動化測試學習之Appium框架(包含adb調試工具介紹)

文章目錄 前言adb調試工具adb組成常用命令獲取程序的包名和界面名文件傳輸發送文件到手機從手機中拉取文件 獲取app啟動時間獲取手機日志其他命令 Appium 簡介工作原理圖 環境搭建安裝客戶端庫&#xff08;appium lib&#xff09;安裝Appium Server安裝JDK&#xff08;自行下載…

【論文解讀】DETR: 用Transformer實現真正的End2End目標檢測

1st authors: About me - Nicolas Carion?Francisco Massa? - ?Google Scholar? paper: [2005.12872] End-to-End Object Detection with Transformers ECCV 2020 code: facebookresearch/detr: End-to-End Object Detection with Transformers 1. 背景 目標檢測&#…

性能測試-jmeter實戰1

課程&#xff1a;B站大學 記錄軟件測試-性能測試學習歷程、掌握前端性能測試、后端性能測試、服務端性能測試的你才是一個專業的軟件測試工程師 性能測試-jmeter實戰1 為什么需要性能測試呢&#xff1f;性能測試的作用&#xff1f;性能測試體系性能測試基礎性能測試工具性能監控…

HTML、XML、JSON 是什么?有什么區別?又是做什么的?

在學習前端開發或者理解互聯網工作原理的過程中&#xff0c;我們經常會遇到三個非常重要的概念&#xff1a;HTML、XML 和 JSON。它們看起來有點像&#xff0c;但其實干的事情完全不同。 &#x1f3c1; 一、他們是誰&#xff1f;什么時候誕生的&#xff1f; 名稱全稱誕生時間誰…

HTML5 全面知識點總結

一、HTML 基礎概念 HTML&#xff1a;超文本標記語言&#xff0c;用于創建網頁和 Web 應用的結構。 超文本&#xff1a;可以包含文字、圖片、音頻、視頻、鏈接等多種媒體。 標記語言&#xff1a;通過標簽標記網頁的各個部分。 二、HTML5 的新特性&#xff08;區別于 HTML4&am…