观察者模式的优点:定义了一个一对多的关系,让多个多个观察者同时监听一个主题对象,当主题对象发生变化的时候,会通知所有的观察者,使他们能够更新自己。
具体的结构图如下:
在图中可以看出,在观察者中维护了一个具体主题对象(Subject),用来维护主题对象发来的消息。
而在主题对象中也维护了一个观察者对象(Observer),用来插入观察者对象并对其发送具体的通知。
具体使用源码如下:
#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{
protected:
string action;
vector<CObserverBase*> observers;
public:
virtual void Attach(CObserverBase* observer) = 0;
virtual void Notify() = 0;
virtual string GetAction() = 0;
virtual void SetAction(string strAction) = 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++;
}
}
string GetAction(){
return action;
}
void SetAction(string strAction){
action = strAction;
}
};
void StockObserver::Update(){
cout << name << "." << sub->GetAction() << ",不要玩股票了,要开始工作了" << endl;
}
void NBAObserver::Update(){
cout << name << ":" << sub->GetAction() << ",不要看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->SetAction("老板要来了");
p->Notify();
getchar();
getchar();
return 0;
}