設計模式學習—–觀察者模式

來源:互聯網
上載者:User

觀察者模式

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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.