十、观察者模式

来源:互联网 发布:winre 数据建模视频 编辑:程序博客网 时间:2024/05/29 09:08

观察者模式(Observer)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主题对象在状态发生变化时,会通知所有观察着对象,使他们能够自动更新自己。

//Subject.h#ifndef _SUBJECT_H_#define _SUBJECT_H_#include <list>#include <string>#include "Observer.h"class Subject{public:Subject();virtual ~Subject();virtual void Attach(Observer* observer);virtual void Detach(Observer* observer);virtual void Notify();virtual void SetState(const string& st)=0;virtual string GetState()=0;private:list<Observer*>* _obvs;};class ConcreteSubject:public Subject{public:ConcreteSubject();void SetState(const string& st);string GetState();private:string _st;};#endif

//Subject.cpp#include "Subject.h"#include <iostream>using namespace std;Subject::Subject(){_obvs = new list<Observer*>;}Subject::~Subject(){}void Subject::Attach(Observer* observer){_obvs->push_back(observer);}void Subject::Detach(Observer* observer){if (!observer){_obvs->remove(observer);}}void Subject::Notify(){list<Observer*>::iterator it;for (it=_obvs->begin();it!=_obvs->end();it++){(*it)->Update();}}ConcreteSubject::ConcreteSubject(){_st='\0';}void ConcreteSubject::SetState(const string& st){_st = st;}string ConcreteSubject::GetState(){return _st;}

//Observer.h#ifndef _OBSERVER_H_#define _OBSERVER_H_#include <string>using namespace std;class Subject;class Observer{public:Observer();virtual ~Observer();virtual void Update()=0;protected:string _st;};class ConcreteObserver1:public Observer{public:ConcreteObserver1(Subject* sub,string name);~ConcreteObserver1();Subject* GetSubject();void Update();protected:Subject* _sub;string _name;};class ConcreteObserver2:public Observer{public:ConcreteObserver2(Subject* sub,string name);~ConcreteObserver2();Subject* GetSubject();void Update();protected:Subject* _sub;string _name;};#endif

//Observer.cpp#include "Observer.h"#include "Subject.h"#include <iostream>using namespace std;Observer::Observer(){_st = '\0';}Observer::~Observer(){}ConcreteObserver1::ConcreteObserver1(Subject* sub,string name){_sub = sub;_name = name;_sub->Attach(this);}ConcreteObserver1::~ConcreteObserver1(){_sub->Detach(this);delete _sub;}Subject* ConcreteObserver1::GetSubject(){return _sub;}void ConcreteObserver1::Update(){_st = _sub->GetState();cout<<"this is observer "<<_name<<" my update state is: "<<_st<<endl;}ConcreteObserver2::ConcreteObserver2(Subject* sub,string name){_sub = sub;_name = name;_sub->Attach(this);}ConcreteObserver2::~ConcreteObserver2(){_sub->Detach(this);delete _sub;}Subject* ConcreteObserver2::GetSubject(){return _sub;}void ConcreteObserver2::Update(){_st = _sub->GetState();cout<<"this is observer "<<_name<<" my update state is: "<<_st<<endl;}

//main.cpp#include "Observer.h"#include "Subject.h"int main(){ConcreteSubject* pSub = new ConcreteSubject();ConcreteObserver1* obs1 = new ConcreteObserver1(pSub,"No1");ConcreteObserver2* obs2 = new ConcreteObserver2(pSub,"No2");pSub->SetState("old");pSub->Notify();pSub->SetState("new");pSub->Notify();return 0;}



原创粉丝点击