概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Observer 观察者接口;
Jack 观察者Jack
Lucy 观察者Lucy
Observable 被观察者;
Weather 被观察者对象;
这里的Weather 有温度 湿度等相关信息,每当 Weather天气数据更新时,作为观察者Jack和 Lucy希望能得到即时通知。。。
代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//观察者
class Observer
{
public:
virtual void Update(float _temperature, float _humidity) = 0;
string Getname()
{
return m_name;
}
string m_name;
};
class Jack : public Observer
{
public:
Jack::Jack()
{
m_name = "Jack";
}
void Update(float _temperature, float _humidity)
{
cout << "今天的温度:" << _temperature << "\t湿度:" << _humidity <<" from " << m_name << endl;
}
};
class Lucy : public Observer
{
public:
Lucy::Lucy()
{
m_name = "Lucy";
}
void Update(float _temperature, float _humidity)
{
cout << "今天的温度:" << _temperature << "\t湿度:" << _humidity <<" from " << m_name << endl;
}
};
//被观察者
class Observable
{
public:
std::vector<Observer*> veclistObserver;
virtual void AddObserver(Observer* pObserver) = 0; //添加观察者
virtual void RemoveObserver(Observer* pObserver) = 0; //删除观察者
virtual void notifyObservers() = 0; //通知所有观察者
};
class Weather : public Observable
{
public:
Weather::Weather()
{
temperature = 0;
humidity = 0;
}
void SetWeatherData(float _temperature, float _humidity) //更新天气数据
{
temperature = _temperature;
humidity = _humidity;
string strInfo;
notifyObservers();
}
void AddObserver(Observer* pObserver)
{
veclistObserver.push_back(pObserver);
}
void RemoveObserver(Observer* pObserver)
{
std::vector<Observer*>::iterator it;
for(it = veclistObserver.begin();it!= veclistObserver.end();it++)
{
if( (*it)->m_name == pObserver->m_name)
{
veclistObserver.erase(it);
break;
}
}
}
void notifyObservers()
{
std::vector<Observer*>::iterator it;
for(it = veclistObserver.begin();it!= veclistObserver.end();it++)
{
(*it)->Update(temperature,humidity);
}
}
float temperature; //气温
float humidity; //湿度
};
int main()
{
Weather weather;
Lucy* observer1 = new Lucy();
Jack* observer2 = new Jack();
weather.AddObserver(observer1);
weather.AddObserver(observer2);
weather.SetWeatherData(26.0,40);
getchar();
return 0;
}
第107行SetWeatherData更新了天气数据,就会调用notifyObservers()(代码第69行),通知所有的观察者。
关注weather的观察者可以随时删除和添加。在某个观察者对天气信息不感兴趣时可随时删除。之后就不再会收到信息。。