設計模式---觀察者模式(發布-訂閱模式)

設計模式—觀察者模式(發布-訂閱模式)

一、簡介

發布-訂閱模式是一種消息傳遞模式,用于實現對象間的一對多依賴關系。在這種模式中:

  • 發布者(Publisher)不直接向訂閱者(Subscriber)發送消息
  • 發布者和訂閱者通過一個中介(通常稱為事件總線或消息代理)進行通信
  • 訂閱者可以訂閱感興趣的事件,發布者可以發布事件

這種模式實現了發布者和訂閱者的解耦,提高了系統的靈活性和可擴展性。

二、原理

2.1核心組件

Publisher(發布者):產生事件/消息的對象

Subscriber(訂閱者):接收并處理事件的對象

Event Bus/Message Broker(事件總線):管理訂閱關系,負責將消息從發布者路由到訂閱者

2.2工作流程

訂閱者向事件總線注冊對特定事件的興趣

發布者向事件總線發布事件

事件總線將事件傳遞給所有注冊的訂閱者

三、C++實現

以下是發布-訂閱模式的簡單C++實現:

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <memory>// 前置聲明
class EventBus;// 訂閱者接口
class Subscriber {
public:virtual ~Subscriber() = default;virtual void handleEvent(const std::string& event, const std::string& message) = 0;
};// 具體訂閱者
class ConcreteSubscriber : public Subscriber {
public:ConcreteSubscriber(const std::string& name) : name_(name) {}void handleEvent(const std::string& event, const std::string& message) override {std::cout << name_ << " received event '" << event << "' with message: " << message << std::endl;}private:std::string name_;
};// 事件總線
class EventBus {
public:// 訂閱事件void subscribe(const std::string& event, Subscriber* subscriber) {subscribers_[event].push_back(subscriber);}// 取消訂閱void unsubscribe(const std::string& event, Subscriber* subscriber) {auto& subs = subscribers_[event];subs.erase(std::remove(subs.begin(), subs.end(), subscriber), subs.end());}// 發布事件void publish(const std::string& event, const std::string& message) {if (subscribers_.find(event) != subscribers_.end()) {for (auto subscriber : subscribers_[event]) {subscriber->handleEvent(event, message);}}}private:std::map<std::string, std::vector<Subscriber*>> subscribers_;
};// 發布者
class Publisher {
public:Publisher(EventBus& eventBus) : eventBus_(eventBus) {}void publish(const std::string& event, const std::string& message) {eventBus_.publish(event, message);}private:EventBus& eventBus_;
};int main() {EventBus eventBus;// 創建訂閱者ConcreteSubscriber sub1("Subscriber1");ConcreteSubscriber sub2("Subscriber2");ConcreteSubscriber sub3("Subscriber3");// 訂閱事件eventBus.subscribe("event1", &sub1);eventBus.subscribe("event1", &sub2);eventBus.subscribe("event2", &sub2);eventBus.subscribe("event2", &sub3);// 創建發布者Publisher publisher(eventBus);// 發布事件publisher.publish("event1", "First event message");publisher.publish("event2", "Second event message");// 取消訂閱eventBus.unsubscribe("event1", &sub2);// 再次發布publisher.publish("event1", "Event after unsubscribe");return 0;
}

代碼運行結果:

微信截圖_20250706152914

四、應用場景

  1. GUI系統中的事件處理
  2. 分布式系統中的消息傳遞
  3. 微服務架構中的服務間通信
  4. 游戲開發中的事件系統
  5. 日志系統和監控系統

優點

  1. 松耦合:發布者和訂閱者不需要知道對方的存在
  2. 可擴展性:可以輕松添加新的發布者或訂閱者
  3. 靈活性:訂閱者可以動態訂閱或取消訂閱事件

缺點

  1. 調試困難:由于間接性,事件流可能難以跟蹤
  2. 性能開銷:消息傳遞可能比直接調用慢
  3. 可能導致內存泄漏:如果訂閱者沒有正確取消訂閱

發布-訂閱模式是現代軟件架構中非常重要的模式,特別是在需要組件間松散耦合的系統中。

參考文章:

1.“牽一發而動全身”——我用觀察者模式簡單模擬吃雞

2.《推薦C++ 23種設計模式》系列第十九期:觀察者模式【架構設計與實現】

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

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

相關文章

一文講清楚React Fiber

文章目錄一文講清楚React Fiber1. 基礎概念1.1瀏覽器刷新率&#xff08;幀&#xff09;1.2 JS執行棧1.3 時間分片1.4 鏈表2. React Fiber是如何實現更新過程控制2.1 任務拆分2.2掛起、恢復、終止2.2.1 掛起2.2.2 恢復2.2.3 終止2.3 任務具備優先級一文講清楚React Fiber 1. 基…

(3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能

(1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 前言 YOLOv 算法通常被用于目標檢測任務&#xff0c;但通過對其進行適當的調整和改造&#xff0c…

主機安全-開源HIDS字節跳動Elkeid使用

安裝好elkeid后就開始接入主機和k8s集群&#xff0c;安裝文檔-----主機安全-開源HIDS字節跳動Elkeid安裝-CSDN博客 1、接入主機 在系統管理-----安裝配置-----復制命令------在目標機器上執行這段命令 執行成功后主機就會自動接入 2、接入k8s集群 在k8s主機上執行腳本&#x…

【vue】用conda配置nodejs,一鍵開通模版使用權

特此鳴謝我的好同學重中之重的特級教學&#xff0c;非常之好用一、conda環境下載安裝二、創建包含nodejs的conda環境創建一個新環境&#xff1a;conda create -n 【自定義環境名字】 python3.9 conda create -n my_nodejs_env python3.9激活新環境&#xff1a;conda activate【…

深度學習--tensor(創建、屬性)

一、torch概念1.1簡介pytorch簡稱torch&#xff0c;意為深度學習框架。它使用張量&#xff08;tensor&#xff09;來表示數據&#xff0c;可以輕松地處理大規模數據集&#xff0c;且可以在GPU上加速。pytorch基本功能&#xff1a;自動微分、自動求導等。1.2安裝官網獲得下載命令…

【內存】Linux 內核優化實戰 - net.ipv4.tcp_max_tw_buckets

目錄net.ipv4.tcp_max_tw_buckets 詳解一、基本概念二、核心作用三、默認值四、調整場景需增大參數的場景需減小參數的場景五、查看與修改方法1. 查看當前值2. 臨時修改&#xff08;重啟失效&#xff09;3. 永久修改&#xff08;重啟生效&#xff09;六、注意事項總結net.ipv4.…

短劇系統開發定制全流程解析:從需求分析到上線運營

一、短劇行業現狀與系統開發價值短劇作為一種新興的內容形態&#xff0c;近年來呈現爆發式增長態勢。2023年中國短劇市場規模已突破300億元&#xff0c;用戶規模超過5億&#xff0c;這種以"快節奏、強劇情、低成本"為特點的內容形式正在重塑數字娛樂產業格局。短劇系…

各服務器廠商調整BIOS睿頻教程

調整BIOS睿頻選項匯總&#xff1a;1、華為服務器&#xff1a;2、華為服務器V53、浪潮服務器4、浪潮服務器M45、 曙光服務器5.1 曙光I620-G205.2 曙光I620-G306、聯想服務器&#xff08;650系列&#xff09;650系列的服務器對照截圖信息修改對應項&#xff0c;修改為截圖里的選項…

PyTorch筆記3----------統計學相關函數

1.基礎函數 import torch a torch.rand(2,2) print("a:\n",a) print(########################) print("平均值:\n",torch.mean(a,dim0)) print("總和:\n",torch.sum(a,dim0)) print("所有元素的積:\n",torch.prod(a,dim0)) print(&…

【Prometheus】通過tar包部署單機版Prometheus 和 Pushgateway

在ECS&#xff08;Elastic Compute Service&#xff09;機器上通過tar包部署 Prometheus 和 Pushgateway&#xff0c;并配置 Prometheus 采集 Pushgateway 的數據&#xff0c;是一個常見的監控部署任務。以下是詳細的步驟說明&#xff1a;&#x1f9e9; 環境準備 操作系統&…

Matlab 頻譜分析 (Spectral Analysis)

文章目錄1. 信號預處理 - 去直流分量2. 快速傅里葉變換&#xff08;FFT&#xff09;3. 功率譜密度&#xff08;PSD&#xff09;計算4. 主頻率檢測5. 譜質心計算6. 對數譜顯示完整的信號處理流程實際應用示例1. 信號預處理 - 去直流分量 data data - mean(data);數學原理&…

【實時Linux實戰系列】實時以太網與 TSN 基礎

在實時系統中&#xff0c;網絡通信的實時性和可靠性是確保系統正常運行的關鍵。實時以太網和時間敏感網絡&#xff08;TSN&#xff09;技術為實時數據傳輸提供了強大的支持。TSN通過一系列協議和機制&#xff0c;確保數據能夠在預定的時間內可靠傳輸&#xff0c;滿足工業自動化…

茶顏悅色JAVA面試分享

1、自我介紹項目2、設計一個爆款飲品秒殺系統&#xff1a;如何解決“幽蘭拿鐵”上新時的瞬時10萬QPS&#xff1f;從緩存、限流、庫存扣減到訂單創建的全流程設計。3、訂單超市未支付自動取消&#xff1a;如何實現高精度&#xff08;30分鐘精確到秒&#xff09;且低延遲的訂單狀…

OneCode圖表配置速查手冊

前言 在數據可視化日益成為業務決策核心驅動力的今天&#xff0c;高效、靈活的圖表配置系統已成為開發人員不可或缺的工具。OneCode圖表組件憑借其豐富的圖表類型與精細化的配置能力&#xff0c;為開發者提供了構建專業數據可視化界面的完整解決方案。然而&#xff0c;隨著圖表…

二維碼驅動的獨立站視頻集成方案

一、獨立站視頻嵌入的技術挑戰與架構設計 在獨立站建設中&#xff0c;視頻內容的集成面臨著性能、安全與用戶體驗的三重挑戰。傳統直接嵌入方式會導致頁面加載緩慢&#xff08;平均增加3-5秒首屏時間&#xff09;、服務器帶寬消耗激增&#xff08;單視頻日均播放1000次約產生50…

【STM32】預分頻因子(Prescaler)和重裝載值(Reload Value)

在 STM32 的 獨立看門狗&#xff08;IWDG&#xff09; 中&#xff08;結合上文【STM32】獨立看門狗&#xff08;提供完整實例代碼&#xff09;&#xff09;&#xff0c;為了控制看門狗的超時時間&#xff08;溢出時間&#xff09;&#xff0c;我們主要設置兩個參數&#xff1a;…

從0到1搭建同城O2O外賣平臺:外賣系統源碼架構解析與實戰指南

當下&#xff0c;越來越多的創業者、品牌連鎖商家&#xff0c;甚至社區集群&#xff0c;開始布局屬于自己的本地外賣平臺。而對于軟件開發者和技術團隊而言&#xff0c;如何從0到1搭建一套可落地、可擴展、可持續運營的外賣系統&#xff0c;成為了一個既現實又挑戰性十足的話題…

MySQL 8.0 OCP 1Z0-908 題目解析(16)

題目61 Choose the best answer. Examine this command, which executes successfully: mysqlbackup --defaults-file/backups/server-my.cnf --backup-dir/backups/full copy-backWhich statement is true about the copy-back process? ○ A) It restores files from the da…

WSL命令

以下是 WSL&#xff08;Windows Subsystem for Linux&#xff09;的常用命令大全&#xff0c;涵蓋安裝、管理、網絡、文件交互等場景&#xff0c;方便快速查閱和使用&#xff1a;1. 安裝與版本管理命令說明wsl --install默認安裝 WSL 和 Ubuntuwsl --install -d <發行版名&g…

AI語音訓練——GPT-SoVITS(GSV)

鏈接說明 github項目地址&#xff1a;RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 項目中文說明書&#xff1a; GPT-SoVITS指南//項目說明書里也有在線使用的鏈接 原項目作者B站教學視頻&#xff1a;耗時兩個…