【c++設(shè)計(jì)模型】之觀察者設(shè)計(jì)模型-創(chuàng)新互聯(lián)

引言

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)建站專業(yè)提供做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、成都響應(yīng)式網(wǎng)站建設(shè)公司、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

用來(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)。

編程思路

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

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

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

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

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

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

#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信號(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>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è)的常變量形參

作用

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

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

文章標(biāo)題:【c++設(shè)計(jì)模型】之觀察者設(shè)計(jì)模型-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://muchs.cn/article24/djigje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、品牌網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、App開發(fā)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化