概念
观察者模式是讲有一个目标,众多个观察者去“观察”目标。目标是目标抽象类的一个派生类,观察者是观察者抽象类的一个派生类。当目标类的数据改变,所有对应的观察者对应去更新自己的状态
可以使用的情况:比如有一个世界时钟程序,有多个图形时钟去显示比如北京时区,巴黎时区,等等。如果设置一个北京时间,那么其他时钟图形都需要更新(加上或者减去时差值)。典型的图形界面设计随处可见,一个温度程序,在温度湿度等条件改变时,要更新多种显示图形来呈现。
实例
使用时,首先定义一个Subject的类对象,然后再定义多个Observer类(派生类)对象,每个Observer对象指定自己被注册到哪个Subject对象内。
示例:
#include<vector>
#include<iostream>
#include<string>
using namespace std;
class Subject;
class Observer{ //观察者抽象类
public:
virtual void update(Subject *base)=0;
protected:
Subject * _subject;
};
class Subject{ //目标抽象类
public:
string s1; //数据值,可以作为私有数据,然后定义一个借口去返回值,这里为了省事
int i1; //数据值
void regiObserver(Observer *obs){
_observer.push_back(obs);
cout<<"已注册"<<endl;
}
void deleObserver(Observer *obs){
_observer.pop_back();
}
void notify(){ //更新所有的观察者
vector<Observer *>::iterator it;
for(it = _observer.begin(); it != _observer.end(); it++)
(*it)->update(this);
}
private:
vector<Observer *> _observer; //观察者容器
};
class FSubject:public Subject{
public:
void set(string s,int i){
s1 = s;
i1 = i;
notify(); //通知观察者。主函数的执行顺序已经保证了所有的观察者都已经进入容器内
}
};
class FObserver :public Observer{ //第一个观察者派生类
public:
FObserver(Subject *base):Observer(){
_subject = base;
_subject->regiObserver(this);
}
void update(Subject *base){
s1 = base->s1;
i1 = base->i1;
display();
}
void display(){
cout<<"更新值,第一个n"<<s1<<endl;
cout<<i1<<endl;
}
private:
string s1;
int i1;
};
class SObserver:public Observer{ //第二个观察者派生类
public:
SObserver(Subject * base){
_subject = base;
_subject->regiObserver(this);
}
void update(Subject *base){
s1 = base->s1;
i1 = base->i1;
display();
}
void display(){
cout<<"更新值,第二个n"<<s1<<endl;
cout<<i1<<endl;
}
private:
string s1;
int i1;
};
int main()
{
FSubject * sub = new FSubject;
FObserver * one = new FObserver(sub);
SObserver * two = new SObserver(sub);
sub->set("ok",3);
return 0;










