觀察者模式
GOOD:定義了一種一對多的關係,讓多個觀察對象(公司員工)同時監聽一個主題對象(秘書),主題對象狀態發生變化時,會通知所有的觀察者,使它們能夠更新自己。
轉載請註明,文章來自:http://blog.csdn.net/windows_nt
樣本:
#include <string>#include <iostream>#include <vector>using namespace std;class Secretary;//看股票的同事類(觀察對象,觀察者)class StockObserver{private:string name;Secretary* sub;public:StockObserver(string strname,Secretary* strsub){name=strname;sub=strsub;}void Update();};//秘書類(主題對象,通知者)class Secretary{private:vector<StockObserver> observers;public:string action;void Add(StockObserver ob){observers.push_back(ob);}void Notify(){vector<StockObserver>::iterator p = observers.begin();while (p!=observers.end()){(*p).Update();p++;}}};void StockObserver::Update(){cout<<name<<":"<<sub->action<<",不要玩股票了,要開始工作了"<<endl;}//用戶端int main(){Secretary *p=new Secretary(); //建立通知者//觀察者StockObserver *s1= new StockObserver("小李",p);StockObserver *s2 = new StockObserver("小趙",p);//加入通知隊列p->Add(*s1);p->Add(*s2);//事件p->action="老闆來了";//通知p->Notify();return 0;}
#include <string>#include <iostream>#include <vector>using namespace std;class SecretaryBase;//抽象觀察者class CObserverBase{protected:string name;SecretaryBase* sub;public:CObserverBase(string strname,SecretaryBase* strsub){name=strname;sub=strsub;}virtual void Update()=0;};//具體的觀察者,看股票的class StockObserver : public CObserverBase{public:StockObserver(string strname,SecretaryBase* strsub) : CObserverBase(strname,strsub){}virtual void Update();};//具體觀察者,看NBA的class NBAObserver : public CObserverBase{public:NBAObserver(string strname,SecretaryBase* strsub) : CObserverBase(strname,strsub){}virtual void Update();};//抽象通知者class SecretaryBase{public:string action;vector<CObserverBase*> observers;public:virtual void Attach(CObserverBase* observer)=0;virtual void Notify()=0;};//具體通知者class Secretary :public SecretaryBase{public:void Attach(CObserverBase* ob){observers.push_back(ob);}void Notify(){vector<CObserverBase*>::iterator p = observers.begin();while (p!=observers.end()){(*p)->Update();p++;}}};void StockObserver::Update(){cout<<name<<":"<<sub->action<<",不要玩股票了,要開始工作了"<<endl;}void NBAObserver::Update(){cout<<name<<":"<<sub->action<<",不要看NBA了,老闆來了"<<endl;}//用戶端:int main(){SecretaryBase *p=new Secretary(); //建立觀察者//被觀察的對象CObserverBase *s1= new NBAObserver("小李",p);CObserverBase *s2 = new StockObserver("小趙",p);//加入觀察隊列p->Attach(s1);p->Attach(s2);//事件p->action="老闆來了";//通知p->Notify();return 0;}
智能化觀察者模式,不用用戶端手動把被觀察者加入觀察隊列
#include <string>#include <iostream>#include <vector>using namespace std;class CObserverBase;//抽象觀察者//具體通知者class Secretary{public:static vector<CObserverBase*> m_ObServerBase;public:Secretary() {}virtual ~Secretary() {}static void Attach(CObserverBase* ob){m_ObServerBase.push_back(ob);}static void Notify();};//抽象觀察者class CObserverBase{public:CObserverBase* m_pObserverBase;public:CObserverBase() { m_pObserverBase = NULL; Connect(); }virtual CObserverBase::~CObserverBase() { Disconnect(); }void Connect(){if (m_pObserverBase) return;Secretary::Attach(this);m_pObserverBase = this;}void Disconnect() {}virtual void OnUpdate() {}};void Secretary::Notify(){vector<CObserverBase*>::iterator p = m_ObServerBase.begin();while (p != m_ObServerBase.end()){(*p)->OnUpdate();p++;}}//具體的觀察者,看股票的class StockObserver : public CObserverBase{public:StockObserver(string strname,Secretary* strsub){}virtual void OnUpdate();};//具體觀察者,看NBA的class NBAObserver : public CObserverBase{public:NBAObserver(string strname,Secretary* strsub) {}virtual void OnUpdate();};void StockObserver::OnUpdate(){cout<<"CBA:"<<"不要玩股票了,要開始工作了"<<endl;}void NBAObserver::OnUpdate(){cout<<"NBA:"<<"不要看NBA了,老闆來了"<<endl;}vector<CObserverBase*> Secretary::m_ObServerBase;//用戶端:int main(){ //建立觀察者Secretary* p = new Secretary; //被觀察的對象NBAObserver *s1= new NBAObserver("小李",p);StockObserver *s2 = new StockObserver("小趙",p);//通知p->Notify();return 0;}