C++ 設(shè)計模式 —— 19.觀察者模式

  • 觀察者模式:一種行為型設(shè)計模式

  • 應(yīng)用場景:
    觀察者模式定義了對象間一對多的依賴關(guān)系合武,當(dāng)一個對象的狀態(tài)發(fā)生改變時稼跳,所有依賴于它的對象都得到通知并被自動更新。這種交互也稱為發(fā)布-訂閱(publish-subscribe)汤善。
    觀察者模式在設(shè)計模式中的地位非常高红淡,在各大框架中的應(yīng)用隨處可見锉屈。
    Qt框架中的信號槽機(jī)制就是觀察者模式的典型應(yīng)用:通過用戶的點(diǎn)擊,觸發(fā)與按鍵點(diǎn)擊所綁定的槽函數(shù)遂黍。

  • 舉例:
    假設(shè)公司中的Boss要發(fā)郵件通知所有下屬員工雾家,那么首先需要在Boss端保存一個所有下屬的郵箱列表芯咧,
    這樣Boss要統(tǒng)一通知所有下屬員工時敬飒,直接向列表中的郵箱逐個發(fā)送即可。

  • 實(shí)現(xiàn)方式:
    Boss類就是被觀察者類带到,類中要有一個用以保存所有下屬郵箱的容器揽惹,還要有一個通知容器中所有對象的方法搪搏。
    每名下屬員工為一個觀察者對象闪金,有一個被通知的方法毕泌。


以下是觀察者模式的簡單代碼實(shí)現(xiàn)
#include <iostream>
#include <set>
using namespace std;

//觀察者抽象類
class Observer
{
public:
    virtual void ReceiveMail(string strMessage) = 0;
};

//被觀察者抽象類
class Subject
{
public:
    virtual void AddObserver(Observer* pObserver) = 0;
    virtual void DeleteObserver(Observer* pObserver) = 0;
    virtual void SendMail(string strMessage) = 0;
};

//被觀察者實(shí)現(xiàn)類
class Boss:public Subject
{
public:
    //添加觀察者
    void AddObserver(Observer *pObserver)
    {
        setObs.insert(pObserver);
    }

    void DeleteObserver(Observer *pObserver)
    {
        setObs.erase(pObserver);
    }

    //通知所有觀察者
    void SendMail(string strMessage)
    {
        for(auto iter = setObs.begin(); iter != setObs.end(); ++iter)
        {
            (*iter)->ReceiveMail(strMessage);
        }
    }

private:
    //存放觀察者的容器
    set<Observer*> setObs;
};

//觀察者實(shí)現(xiàn)類
class Staff:public Observer
{
public:
    Staff(string strName):m_strName(strName){}

    //收到通知挠说,取郵件并顯示
    void ReceiveMail(string strMessage)
    {
        cout << "Staff " << m_strName << " Receive Mail:" << strMessage << endl;
    }

private:
    string m_strName;
};
主函數(shù)中的使用
int main()
{
    Subject* pBoss = new Boss();

    Observer* pStaffA = new Staff("Mark");
    pBoss->AddObserver(pStaffA);
    Observer* pStaffB = new Staff("Jeremy");
    pBoss->AddObserver(pStaffB);

    pBoss->SendMail("test");

    return 0;
}
控制臺輸出結(jié)果
Staff Mark Receive Mail:test
Staff Jeremy Receive Mail:test

如有錯誤损俭,歡迎指正

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杆兵,一起剝皮案震驚了整個濱河市琐脏,隨后出現(xiàn)的幾起案子日裙,更是在濱河造成了極大的恐慌惰蜜,老刑警劉巖抛猖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撑碴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鱼辙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門倒戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杜跷,“玉大人矫夷,你說我怎么就攤上這事双藕∮桥悖” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阱飘。 經(jīng)常有香客問我虱颗,道長上枕,這世上最難降的妖魔是什么辨萍? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮义起,結(jié)果婚禮上默终,老公的妹妹穿的比我還像新娘犁罩。我一直安慰自己床估,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碑韵,像睡著了一般泼诱。 火紅的嫁衣襯著肌膚如雪赊锚。 梳的紋絲不亂的頭發(fā)上舷蒲,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天牲平,我揣著相機(jī)與錄音纵柿,去河邊找鬼昂儒。 笑死,一個胖子當(dāng)著我的面吹牛腊嗡,可吹牛的內(nèi)容都是我干的燕少。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恒傻!你這毒婦竟也來了碌冶?” 一聲冷哼從身側(cè)響起譬重,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塔嬉,沒想到半個月后恩袱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澈吨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屈藐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓扯。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡公壤,死狀恐怖沾鳄,靈堂內(nèi)的尸體忽然破棺而出译荞,到底是詐尸還是另有隱情,我是刑警寧澤篙骡,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布得湘,位于F島的核電站忽刽,受9級特大地震影響些阅,放射性物質(zhì)發(fā)生泄漏市埋。R本人自食惡果不足惜抒倚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馅扣。 院中可真熱鬧,春花似錦、人聲如沸公罕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春省核,著一層夾襖步出監(jiān)牢的瞬間邻储,已是汗流浹背脓匿。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工袱瓮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绊起,地道東北人虱歪。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓萧落,卻偏偏與公主長得像找岖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容