1. 程式人生 > >訊息機制簡單實現模組間解耦

訊息機制簡單實現模組間解耦

訊息機制一直是軟體開發中減少模組之間耦合的標準方式,下面我們舉一個簡單的例子,看看是如何通過訊息,減少類 A 和類 B之間的耦合度的。

下面是傳統的方法,實現 A 對 B 類的某個方法的呼叫,不使用訊息機制的傳統方法,A 需要持有 B 的物件,並且 A 要知道所要呼叫的B的方法,這樣 A 和 B 就強耦合在了一起,一旦 B 類發生變化,A 類就可能要重新編譯,而且如果 doSomethingBSpecial 這個方法需要改名,或者修改引數,A 類就也需要修改,這樣的依賴關係就帶來了諸多的不便。

  1. #include “stdafx.h”
  2. #include <vector>
  3. #include <iostream>
  4. class B
  5. {
  6. public:
  7.     void doSomethingBSpecial()
  8.     {
  9.         //B 做一些事情
  10.         std::cout << “B do something…” << std::endl;
  11.     }
  12. };
  13. class A
  14. {
  15. public:
  16.     A(B* b) :m_b(b){}
  17.     void doSomethingASpecial()
  18.     {
  19.         //在這個方法中,會呼叫B 的 doSomethingBSpecial
  20.         m_b->doSomethingBSpecial();
  21.     }
  22. private:
  23.     B* m_b;
  24. };
  25. int _tmain(int argc, _TCHAR* argv[])
  26. {
  27.     A a(new B());
  28.     a.doSomethingASpecial();
  29.     return 0;
  30. }

下面使用訊息機制實現同樣的呼叫,這樣 A 就不需要引用 B 的物件,同時 A 也不需要知道 B 的方法,實現了 A 類 和 B 類的解耦。

下面簡易的實現了一個的訊息處理器,只具備簡易的註冊,刪除和觸發事件的功能,在客戶的程式碼中,把 B 的物件註冊到訊息處理器,使 B 可以處理 doSomethingASpecial 這個訊息,然後在 A 類需要呼叫 B 的方法的地方, 可以直接用訊息處理器處理 doSomethingASpecial 這個訊息,MsgMgr::handle(“doSomethingASpecial”) 這樣呼叫以後,所有註冊過 doSomethingASpecial 這個訊息的物件(包括 B 物件),都會接受並且處理這個訊息,B 物件的 handle 方法就會被呼叫,然後在這個方法裡就可以去呼叫 B 的 doSomethingBSpecial 方法,這樣就實現了 A 對 B類的 doSomethingBSpecial 方法的呼叫, 去掉了 A 和 B 之間的耦合依賴關係。

  1. #include “stdafx.h”
  2. #include <vector>
  3. #include <iostream>
  4. #include <map>
  5. #include <string>
  6. //使用訊息機制,A 就不需要持有 B 的物件,
  7. //訊息接受者介面
  8. class MsgReceiver
  9. {
  10. public:
  11.     virtual void handle() = 0;
  12. };
  13. //這裡實現一個簡易的訊息處理器,只具備簡易的,註冊,刪除,和觸發事件的功能
  14. static std::map<std::string, MsgReceiver*> m_allMsgRecevers;
  15. class MsgMgr
  16. {
  17. public:
  18.     static void addReceiver(std::string msg, MsgReceiver* receiver)
  19.     {
  20.        m_allMsgRecevers.emplace(msg, receiver);
  21.     }
  22.     static void removeReceiver(std::string msg)
  23.     {
  24.        m_allMsgRecevers.erase(msg);
  25.     }
  26.     static void handle(std::string msg)
  27.     {
  28.         m_allMsgRecevers.at(msg)->handle();
  29.     }
  30. };
  31. class A
  32. {
  33. public:
  34.     void doSomethingASpecial()
  35.     {
  36.         //這裡如果想呼叫 B 的 doSomethingBSpecial 方法
  37.         //可以直接用訊息處理器處理 doSomethingASpecial 這個訊息
  38.         //因為 B 已經註冊宣告過可以處理 doSomethingASpecial 這個訊息
  39.         //MsgMgr::handle(“doSomethingASpecial”) 這樣呼叫以後,所有
  40.         //註冊過 doSomethingASpecial 這個訊息的物件,都會接受並且處理這個訊息
  41.         //這樣就去掉了A 和 B之間的耦合依賴關係
  42.         MsgMgr::handle(“doSomethingASpecial”);
  43.     }
  44. };
  45. class B : public MsgReceiver
  46. {
  47. public:
  48.     void doSomethingBSpecial()
  49.     {
  50.         //B 做一些事情
  51.         std::cout << “B do something…” << std::endl;
  52.     }
  53.     virtual void handle() override
  54.     {
  55.         doSomethingBSpecial();
  56.     }
  57. };
  58. int _tmain(int argc, _TCHAR* argv[])
  59. {
  60.     A a;
  61.     B* b = new B;
  62.     //這裡把 B 的物件註冊到訊息處理器,使 B 可以處理 doSomethingASpecial 這個訊息
  63.     MsgMgr::addReceiver(“doSomethingASpecial”, b);
  64.     a.doSomethingASpecial();
  65.     return 0;
  66. }

以上的程式碼都是可以直接複製貼上在 visual studio 中執行的。

相關推薦

訊息機制簡單實現模組

訊息機制一直是軟體開發中減少模組之間耦合的標準方式,下面我們舉一個簡單的例子,看看是如何通過訊息,減少類 A 和類 B之間的耦合度的。 下面是傳統的方法,實現 A 對 B 類的某個方法的呼叫,不使用訊息機制的傳統方法,A 需要持有 B 的物件,並且 A 要

Android學習探索之運用MVP設計模式實現項目

Android 前言: 一直致力於提高開發效率降低項目耦合,今天想抽空學習一下MVP架構設計模式,學習一下如何運用到項目中。 MVP架構設計模式 MVP模式是一種架構設計模式,也是一種經典的界面模式。MVP中的M代表Model, V是View, P是Pre

Python3 Socket與Socket心跳機制簡單實現

什麼是 Socket? Socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求,使主機間或者一臺計算機上的程序間可以通訊。 socket()函式 Python 中,我們用 socket()函式來建立套接字,語法格式如下: socket.s

利用Spring IOC DI 實現軟體分層

1.軟體分層思想 在軟體領域有MVC軟體設計思想,指導著軟體開發過程。在javaee開發領域,javaee的經典三層架構MVC設計思想的經典應用。而在軟體設計思想中,追求的是"高內聚 低耦合"的目標,利用Spring的IOC 和 DI 可以非常方便的實現這個需求。 2

springboot中整合feign實現模組http介面呼叫

1.場景還原     在多模組開發的過程中,為了避免一些重複的“硬程式碼”的編寫,我們可以在A模組中定義一個實現類,然後在B模組中遠端呼叫,這樣減少了程式碼冗餘及業務硬程式碼的重複編寫2.實現方案這裡以筆者專案的訂單模組遠端呼叫狀態機模組介面為例,僅供參考①訂單模組的pom依

UniRx---簡單封裝一個SubjectManager 主題和監聽者

Subject<T> 是UniRx 推薦的 事件實現方式 ( UniRx是AssetStore上的一款免費外掛,但其實他的出身很地道,脫胎於微軟的Rx框架,主要思想是像Linq那樣對訂閱的事件進行操作,並且他還能對操作進行 時間排程,執行緒排程,而UniRx就是Rx的

使用單例和工廠設計模式實現dao實現層的

建立Dao具體例項的工廠:         工廠解耦: 只需在配置檔案中改動,而不需要修改原始碼                       各層之間耦合性極低       使用的設計模式: 單例 和 工廠                       ***********

Python之美[從菜鳥到高手]--Python垃圾回收機制及gc模組

    Python中的垃圾回收是以引用計數為主,標記-清除和分代收集為輔。引用計數最大缺陷就是迴圈引用的問題,所以Python採用了輔助方法。本篇文章並不詳細探討Python的垃圾回收機制的內部實現,而是以gc模組為切入點學習Python的垃圾回收機制,如果想深入可以讀讀

Win32訊息機制(視窗實現過程)

Dos的過程驅動與Windows的事件驅動 在講本程式的訊息迴圈之前,我想先談一下Dos與Windows驅動機制的區別: DOS程式主要使用順序的,過程驅動的程式設計方法。順序的,過程驅動的程式有一個明顯的開始,明顯的過程及一個明顯的結束,因此程式能直接控制程式事件或

C++利用反射和簡單工廠模式實現業務模組

1. 業務說明 為了便於說明,舉一個簡單的例子。假設現在有一個專案需要建立一個和銀行互動的平臺,目前只接入工商銀行,後續接入其他銀行,每個銀行的業務都有差異,報文格式可能也不一致。 這裡只列舉幾個簡要的流程,僅包括拼報文,傳送報文,接收報文,解析報文,其餘整體架構以及

redis的佇列訊息實現應用

過度耦合的缺點:php應用中,過度的耦合使得系統拓展性變弱,聯動性錯誤。 今天我給大家介紹的是利用redis的佇列訊息實現模組間的解耦。 應用場景:使用者在採購模組下單買了一批貨物回來,簽收時要在倉庫模組新增相應的庫存,普通的做法就是在簽收完成的時候通過介面給倉庫模組推送資料執行入庫操作。但是這麼做如果倉庫模

遊戲架構之模組通訊(訊息機制)

一、 先談一談個人對遊戲框架的一點理解,顧名思義,框架是一個專案的骨架,如同大樹的主幹,搭建框架,在此基礎上再加入各個功能模組,構成有一個完整的專案。如同一棵樹有一個健壯的主幹,再從主幹上生長出一個一個的分支,最終長成一顆枝繁葉茂的大樹。此外,框架會設定好模組的基本格式,更

模組通訊 --訊息機制

作者昨天遇到一個問題,就是其中一個對話方塊裡的樹節點雙擊時,需要通知另一個對話方塊中去通過SDK獲取資料庫中的資訊(不同的對話方塊獲取不同的資料資訊),並且該對話方塊中有一個map表存有多個對話方塊的基類指標。這時怎麼通過基類的指標實現呼叫另一個或多個對話方塊的不同實現呢?這時我們可以藉

ios業務模組互相跳轉的方案

*此文章需有一點runtime的知識,如果你不瞭解runtime,《快速理解Runtime of Objective-C》:問題:一個app通常由許多個模組組成,所有模組之間免不了會相互呼叫,例如一個讀

SOA中的介面劃分與系統模組,和通訊

最近要做xxx管理系統產品的時候,需要達到以下要求,可以根據不同客戶的不同需求,將已經開發好的模組無縫的新增,和刪除。 經過技術分析需要 採用以下技術:                             1.SOA  理念                       

如何用最簡單的方式解釋依賴注入?依賴注入是如何實現的?

依賴注入(DI)和控制反轉(IOC)基本是一個意思,因為說起來誰都離不開誰。簡單來說,a依賴b,但a不控制b的建立和銷燬,僅使用b,那麼b的控制權交給a之外處理,這叫控制反轉(IOC),而a要依賴b,必然要使用b的instance,那麼通過a的介面,把b傳入;通過a的構造,把

簡單的工廠+反射+ xml

logs trace att loader 類加載 一個 encoding saxreader cnblogs 傳統的調用業務層是:   CustomerServiceImpl csi = new CustomerServiceImpl(); 通過面向接口編程改進過後:  

commons-logging日誌實現

truct illegal 工廠 man int 行為 efault context buffered 一、需要解耦 日誌是實際應用中的一個重要部分,日誌系統也有許多開源的實現,如java.util.logging, logback, log4j系列等。

對稱加密詳,以及JAVA簡單實現

turn bsp 十進制 stat mage 需要 對稱密鑰 else ges (原) 常用的加密有3種 1、正向加密,如MD5,加密後密文固定,目前還沒辦法破解,但是可以能過數據庫撞庫有一定概率找到,不過現在一般用這種方式加密都會加上鹽值。 2、對稱加密,通過一個固定

簡單實現Linux/Windows系統文件互傳

小工具需求:有在不同平臺互傳文件的需求,會使用遠程工具登錄Linux服務器。前提:使用遠程工具Xshell/SecureCRT登錄遠程Linux服務器(暫不支持putty)安裝:yum install -y lrzsz使用:Windows內文件傳至Linux: rz + Enterrz傳遞的文件默認保