观察者模式

来源:互联网 发布:奥运会易建联数据 编辑:程序博客网 时间:2024/06/12 20:10




观察者模式(Observer)定义了对象间一对多的联系。当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。观察者模式将被观察的目标和观察者解耦,一个目标可以有任意多的观察者,观察者也可以观察任意多的目标,构成复杂的联系,而每个观察者都不知道其他观察者的存在。

GOOD:定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。


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