日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
【c++設(shè)計(jì)模型】之觀察者設(shè)計(jì)模型-創(chuàng)新互聯(lián)

引言

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

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

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

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

解決的問題

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

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

編程思路

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

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

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

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

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

    另一個(gè)方法為:信號函數(shù):通知事件函數(shù)執(zhí)行邏輯:首先遍歷容器中,有沒有感興趣的事件ID,如果有,則代表一系列的觀察者,對這個(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信號,執(zhí)行1信號對應(yīng)的槽函數(shù)"<< endl;
            break;
        case 2:
            cout<< this<< "接收到2信號,執(zhí)行2信號對應(yīng)的槽函數(shù)"<< endl;
            break;
        case 3:
            cout<< this<< "接收到3信號,執(zhí)行3信號對應(yīng)的槽函數(shù)"<< endl;
            break;
        case 4:
            cout<< this<< "接收到4信號,執(zhí)行4信號對應(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<< "接收到未知信號,沒有對應(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;
}

知識小百科

this指針

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

作用

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

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


網(wǎng)站名稱:【c++設(shè)計(jì)模型】之觀察者設(shè)計(jì)模型-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/djigje.html