欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++示例講解觀察者設(shè)計(jì)模式

 更新時(shí)間:2022年12月26日 17:13:36   作者:編程遠(yuǎn)泊  
觀察者模式是極其重要的一個(gè)設(shè)計(jì)模式,也是我?guī)啄觊_(kāi)發(fā)過(guò)程中使用最多的設(shè)計(jì)模式,本文首先概述觀察者模式的基本概念和Demo實(shí)現(xiàn),接著是觀察者模式在C++中的應(yīng)用,最后是對(duì)觀察者模式的應(yīng)用場(chǎng)景和優(yōu)缺點(diǎn)進(jìn)行總結(jié)

引言

用來(lái)解決兩個(gè)不相關(guān)對(duì)象之間的一對(duì)一或者一對(duì)多的通信模型。

什么是觀察者設(shè)計(jì)模式

觀察者模式是一種對(duì)象行為模式。它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系, 當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。在觀察者模式中,主體是通知的發(fā)布者,它發(fā)出通知時(shí)并不需要知道誰(shuí)是它的觀察者,可以有任意數(shù)目的觀察者訂閱并接受通知。觀察者模式不僅被廣泛應(yīng)用于軟件界面元素之間的交互,在業(yè)務(wù)對(duì)象之間的交互、權(quán)限管理等方面也有廣泛的應(yīng)用。

解決的問(wèn)題

定義了對(duì)象間的一種一對(duì)多的組合關(guān)系,以便一個(gè)對(duì)象的狀態(tài)發(fā)生時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新。

觀察者和被觀察者之間存在“觀察”的邏輯關(guān)系,當(dāng)被觀察者發(fā)生變化時(shí),觀察者就會(huì)觀察到這樣的變化,并作出相應(yīng)的響應(yīng)。

編程思路

設(shè)定兩者類,一個(gè)為觀察者類,一個(gè)為被觀察者類

觀察者類中,定義一個(gè)對(duì)某個(gè)事件感興趣的處理函數(shù),一般也叫做槽函數(shù)

被觀察者類中,定義一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)保存觀察者對(duì)某一個(gè)事件id(信號(hào))感興趣,使用數(shù)據(jù)結(jié)構(gòu)建立信號(hào)與對(duì)象之間的映射關(guān)系

被觀察者類中,定義兩個(gè)方法函數(shù):

一個(gè)方法為:添加觀察者與其感興趣的事件id(信號(hào))加入到容器中

另一個(gè)方法為:信號(hào)函數(shù):通知事件函數(shù)執(zhí)行邏輯:首先遍歷容器中,有沒(méi)有感興趣的事件ID,如果有,則代表一系列的觀察者,對(duì)這個(gè)事件感興趣,那么再次遍歷觀察者列表,讓每一個(gè)觀察者執(zhí)行相應(yīng)的槽函數(shù)

#include <iostream>
#include <map>
#include <list>
using 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信號(hào),執(zhí)行1信號(hào)對(duì)應(yīng)的槽函數(shù)" << endl;
            break;
        case 2:
            cout << this << "接收到2信號(hào),執(zhí)行2信號(hào)對(duì)應(yīng)的槽函數(shù)" << endl;
            break;
        case 3:
            cout << this << "接收到3信號(hào),執(zhí)行3信號(hào)對(duì)應(yīng)的槽函數(shù)" << endl;
            break;
        case 4:
            cout << this << "接收到4信號(hào),執(zhí)行4信號(hào)對(duì)應(yīng)的槽函數(shù)" << endl;
            break;
        }
    }
    ~Recv()override
    {
        cout << "Recv destruct" << endl;
    }
};
class Sender
{
public:
    Sender()
    {
        cout << "sender structure" << endl;
    }
    map<int,list<RecvBase* >> 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 << "接收到未知信號(hào),沒(méi)有對(duì)應(yīng)的可執(zhí)行槽函數(shù)" << 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;
}

知識(shí)小百科

this指針:

  • 是本對(duì)象的起始地址,用const修飾的常地址(原型:stu *const this)(本文代碼中this的作用)
  • 是隱藏在成員函數(shù)(非靜態(tài)函數(shù))的最左側(cè)的常變量形參

作用:

  • 區(qū)別成員屬性和成員函數(shù)的形參
  • 解引用,返回本對(duì)象的地址

到此這篇關(guān)于C++示例講解觀察者設(shè)計(jì)模式的文章就介紹到這了,更多相關(guān)C++觀察者設(shè)計(jì)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CentOS下Jsoncpp安裝配置的方法

    CentOS下Jsoncpp安裝配置的方法

    本文主要介紹了CentOS下Jsoncpp安裝配置的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++實(shí)現(xiàn)翻轉(zhuǎn)單詞順序

    C++實(shí)現(xiàn)翻轉(zhuǎn)單詞順序

    這篇文章給大家匯總介紹了C++實(shí)現(xiàn)翻轉(zhuǎn)單詞順序的三種方法,都非常的簡(jiǎn)單,需要的朋友可以參考下
    2016-07-07
  • Mac下使用Eclipse編譯C/C++文件出現(xiàn) launch failed, binary not found 解決方案

    Mac下使用Eclipse編譯C/C++文件出現(xiàn) launch failed, binary not found 解決方

    這篇文章主要介紹了Mac下使用Eclipse編譯C/C++文件出現(xiàn) launch failed, binary not found 解決方案,需要的朋友可以參考下
    2014-10-10
  • VisualStudio2022編寫(xiě)C語(yǔ)言的實(shí)現(xiàn)步驟

    VisualStudio2022編寫(xiě)C語(yǔ)言的實(shí)現(xiàn)步驟

    VisualStudio2022是一款強(qiáng)大的集成開(kāi)發(fā)環(huán)境,可以用來(lái)編寫(xiě)C語(yǔ)言程序,本文主要介紹了VisualStudio2022編寫(xiě)C語(yǔ)言的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 淺析C++內(nèi)存布局

    淺析C++內(nèi)存布局

    本文給大家介紹了C++內(nèi)存布局的相關(guān)知識(shí),通過(guò)進(jìn)程間通信比線程間通信難也是因?yàn)檫M(jìn)程間的用戶空間是相互隔離的,無(wú)法相互訪問(wèn),需要通過(guò)進(jìn)程間通信方式通信,通過(guò)內(nèi)核地址空間
    2021-10-10
  • 一文帶你學(xué)習(xí)C++中的派生機(jī)制

    一文帶你學(xué)習(xí)C++中的派生機(jī)制

    C++是一門面向?qū)ο蟮木幊陶Z(yǔ)言,其中的派生機(jī)制是其重要的面向?qū)ο筇匦灾?。本文我們就?lái)詳細(xì)地學(xué)習(xí)一下C++中的派生機(jī)制的相關(guān)知識(shí)吧
    2023-04-04
  • C++菱形繼承和虛繼承的實(shí)現(xiàn)

    C++菱形繼承和虛繼承的實(shí)現(xiàn)

    本文主要介紹了C++菱形繼承和虛繼承的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++實(shí)現(xiàn)添加圖片水印到PDF文檔

    C++實(shí)現(xiàn)添加圖片水印到PDF文檔

    水印是顯示在文檔內(nèi)容后面的淡色文字或圖片,可以用于指示文檔的狀態(tài)(保密、草稿等),本文主要為大家介紹了如何使用?Spire.PDF?for?C++?在?PDF?文檔中添加圖片水印,需要的可以參考下
    2023-11-11
  • Gstreamer基礎(chǔ)知識(shí)教程

    Gstreamer基礎(chǔ)知識(shí)教程

    由于deepstream是基于gstreamer的,所以要想在deepstream上做拓展,需要對(duì)gstreamer有一定的認(rèn)識(shí),以下主要介紹Gstreamer整體框架和Gstreamer基礎(chǔ)概念,需要的朋友可以參考下
    2022-07-07
  • C++中的偽隨機(jī)數(shù)

    C++中的偽隨機(jī)數(shù)

    這篇文章主要介紹了C++中的偽隨機(jī)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論