刚刚在csdn看到某位博主关于观察者模式的讲解,感觉很好,于是照葫芦画瓢简单实现了下观察者模式。
此博主关于 气象站 的故事例子及设计模式和设计原则的讲解深入浅出,通俗易懂我就不再废话了....
读者先看看这 http://blog.csdn.net/xuzhonghai/article/details/7239981, 然后可以参考下面本人C++
简单实现的代码和注释:
#include <iostream>
using namespace std;
#include <vector>
#define PERROR(a) (cout<<a<<endl)
/*气象环境监控系统-- 观察者模式实现*/
//观察者基类
class Observer
{
public:
virtual void update(float temperture, float humidity, float pressure) = 0;
virtual void display(ostream &os) = 0;
};
//被观察者基类
class Observed
{
public:
virtual void addObserver(Observer &) = 0; //维护观察者列表,增加观察者
virtual void removeObserver(Observer &) = 0;//维护观察者l列表,删除观察者
virtual void notifyObserver() = 0;//给所有观察者发送消息
virtual void setMeasurements(float temperture, float humidity, float pressure) = 0;
};
/*************以上都是观察者和被观察者基类接口的定义, 下面是具体实现类*********************************/
//被观察的气象数据 类继承被观察者基类
class WeatherData:public Observed
{
public:
WeatherData(){
this->temperture = 0;
this->humidity = 0;
this->pressure = 0;
this->iter = m_vector.begin();
}
virtual void addObserver(Observer &o) //维护观察者列表,增加观察者
{
m_vector.push_back(&o);
}
virtual void removeObserver(Observer &o)//维护观察者,删除观察者
{ // ...
}
virtual void notifyObserver()//给所有观察者发送消息
{
for(iter = m_vector.begin(); iter != m_vector.end(); ++iter){
(*iter)->update(temperture, humidity, pressure);
}
}
//天气信息改变 自动触发measurementsChange()
void setMeasurements(float temperture, float humidity, float pressure)
{
this->temperture = temperture;
this->humidity = humidity;
this->pressure = pressure;
this->iter = m_vector.begin();
measurementsChange();
}
//检测所有信息的改变 并告诉所有观察者
void measurementsChange()
{
this->notifyObserver();
}
private:
vector<Observer*> m_vector;//所有观察者列表 注意不要给vector的模板类型为Observer的对象类型,用其指针类型,因为Observer为抽象类
vector<Observer*>::iterator iter;
float temperture; //温度
float humidity; //湿度
float pressure; //气压
};
//具体的观察者类 天气环境状况显示类
class CurrentConditionsDisplay: public Observer
{
public:
//CurrentConditionsDisplay(){}
CurrentConditionsDisplay(Observed &weatherdata)
{
this->weatherdata = &weatherdata;
this->weatherdata->addObserver(*this);
}
void update(float temperture, float humidity, float pressure)
{
PERROR("--------start update---------");
this->temperture = temperture;
this->humidity = humidity;
this->pressure = pressure;
//PERROR("end update ...");
}
void display(ostream &os)
{
os<<" 温度: "
<<this->temperture<<"'c 湿度: "
<<this->humidity <<"% 气压: "
<<pressure<<"Pa"<<endl<<endl;
}
private:
float temperture;
float humidity;
float pressure;
Observed *weatherdata;//注意这里不要用Observed的对象,而用其对像的指针, 因为Observed定义为的是一个抽象类
};
//测试程序
int main(void)
{
//WeatherData *weatherdata = new WeatherData;
//CurrentConditionsDisplay *showconditions = new CurrentConditionsDisplay(*weatherdata);
Observed *weatherdata = new WeatherData;
Observer *showconditions = new CurrentConditionsDisplay(*weatherdata);
weatherdata->setMeasurements(8.0, 25, 1000);
showconditions->display(cout);
weatherdata->setMeasurements(10.7, 26.3, 1200);
showconditions->display(cout);
weatherdata->setMeasurements(20.7, 24.3, 1150);
showconditions->display(cout);
delete weatherdata;
delete showconditions;
return 0;
}
运行结果截图: