簡單講解觀察者設計模式
導讀 | 觀察者模式是極其重要的一個設計模式,也是我幾年開發過程中使用最多的設計模式,本文首先概述觀察者模式的基本概念和Demo實現,接著是觀察者模式在C++中的應用,最後是對觀察者模式的應用場景和優缺點進行總結 |
用來解決兩個不相關物件之間的一對一或者一對多的通訊模型。
觀察者模式是一種物件行為模式。它定義物件間的一種一對多的依賴關係, 當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。在觀察者模式中,主體是通知的釋出者,它發出通知時並不需要知道誰是它的觀察者,可以有任意數目的觀察者訂閱並接受通知。觀察者模式不僅被廣泛應用於軟體介面元素之間的互動,在業務物件之間的互動、許可權管理等方面也有廣泛的應用。
定義了物件間的一種一對多的組合關係,以便一個物件的狀態發生時,所有依賴於它的物件都得到通知並自動重新整理。
觀察者和被觀察者之間存在“觀察”的邏輯關係,當被觀察者發生變化時,觀察者就會觀察到這樣的變化,並作出相應的響應。
設定兩者類,一個為觀察者類,一個為被觀察者類
觀察者類中,定義一個對某個事件感興趣的處理函式,一般也叫做槽函式
被觀察者類中,定義一個資料結構,用來儲存觀察者對某一個事件id(訊號)感興趣,使用資料結構建立訊號與物件之間的對映關係
被觀察者類中,定義兩個方法函式:
一個方法為:新增觀察者與其感興趣的事件id(訊號)加入到容器中
另一個方法為:訊號函式:通知事件函式執行邏輯:首先遍歷容器中,有沒有感興趣的事件ID,如果有,則代表一系列的觀察者,對這個事件感興趣,那麼再次遍歷觀察者列表,讓每一個觀察者執行相應的槽函式
#include#include#includeusing namespace std; class RecvBase { public: RecvBase() { cout << "RecvBase structure" << endl; } virtual void slotFunctions(int msgid)=0; virtual ~RecvBase() { cout << "RecvBase destruct" << endl; } }; class Recv:public RecvBase { public: Recv() { cout << "Recv structure" << "---" << this << "---" << endl; } void slotFunctions(int msgid)override { switch(msgid) { case 1: cout << this << "接收到1訊號,執行1訊號對應的槽函式" << endl; break; case 2: cout << this << "接收到2訊號,執行2訊號對應的槽函式" << endl; break; case 3: cout << this << "接收到3訊號,執行3訊號對應的槽函式" << endl; break; case 4: cout << this << "接收到4訊號,執行4訊號對應的槽函式" << endl; break; } } ~Recv()override { cout << "Recv destruct" << endl; } }; class Sender { public: Sender() { cout << "sender structure" << endl; } map<1int,list> RecvMap; void observerToRecvMap(int msgid,RecvBase* recv) { this->RecvMap[msgid].push_back(recv); } void senderSignals(int msgid) { auto it = RecvMap.find(msgid); if(it!=RecvMap.end()) { for(RecvBase* p:it->second) { p->slotFunctions(msgid); } }else{ cout << "接收到未知訊號,沒有對應的可執行槽函式" << endl; } } ~Sender() { cout << "sender destruct" << endl; } }; int main() { Sender sender; RecvBase* r1=new Recv(); RecvBase* r2=new Recv(); RecvBase* r3=new Recv(); RecvBase* r4=new Recv(); sender.observerToRecvMap(1,r1); sender.observerToRecvMap(1,r2); sender.observerToRecvMap(2,r2); sender.observerToRecvMap(3,r3); sender.observerToRecvMap(4,r4); while(true) { int msgid; cin >> msgid; if(-1==msgid)break; sender.senderSignals(msgid); } delete r1; delete r2; delete r3; delete r4; return 0; }
this指標:
- 是本物件的起始地址,用const修飾的常地址(原型:stu *const this)(本文程式碼中this的作用)
- 是隱藏在成員函式(非靜態函式)的最左側的常變數形參
- 區別成員屬性和成員函式的形參
- 解引用,返回本物件的地址
作用:
到此這篇關於C++示例講解觀察者設計模式的文章就介紹到這了
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2933062/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡說設計模式——觀察者模式設計模式
- 極簡設計模式-觀察者模式設計模式
- 【程式碼簡述設計模式】----- 觀察者模式設計模式
- 設計模式 —— 觀察者模式設計模式
- 設計模式(觀察者模式)設計模式
- 設計模式----觀察者模式設計模式
- 【設計模式】觀察者模式設計模式
- 設計模式——觀察者模式設計模式
- PHP設計模式-觀察者模式PHP設計模式
- Java設計模式-觀察者模式Java設計模式
- 設計模式解析:觀察者模式設計模式
- 設計模式之觀察者模式設計模式
- 設計模式之-觀察者模式設計模式
- 設計模式 #6 (觀察者模式)設計模式
- JS設計模式(觀察者模式)JS設計模式
- 設計模式(十六)觀察者模式設計模式
- 設計模式之【觀察者模式】設計模式
- 設計模式(9) 觀察者模式設計模式
- 設計模式-觀察者模式上設計模式
- 設計模式-觀察者模式下設計模式
- 行為型設計模式 - 觀察者模式詳解設計模式
- Go 設計模式之觀察者模式Go設計模式
- 設計模式之觀察者模式(一)設計模式
- PHP 設計模式之——觀察者模式PHP設計模式
- 設計模式實戰 - 觀察者模式設計模式
- PHP設計模式(5)—— 觀察者模式PHP設計模式
- JavaScript設計模式之觀察者模式JavaScript設計模式
- golang設計模式之觀察者模式Golang設計模式
- Java 設計模式之《觀察者模式》Java設計模式
- 設計模式解析-1:觀察者模式設計模式
- python設計模式之觀察者模式Python設計模式
- PHP設計模式之觀察者模式PHP設計模式
- 《Head First 設計模式》:觀察者模式設計模式
- PHP 設計模式之觀察者模式PHP設計模式
- 徒手擼設計模式-觀察者模式設計模式
- 設計模式中的觀察者模式設計模式
- GoLang設計模式13 - 觀察者模式Golang設計模式
- iOS 設計模式_觀察者_KVOiOS設計模式