-
觀察者模式:一種行為型設(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
如有錯誤损俭,歡迎指正