观察者模式
最后更新于:2022-04-01 20:29:16
## 模式定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
## 模式结构:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c5458ce17d6.jpg)
## 举例:
气象系统有三个部分分别是气象站(获取实际气象数据的物理装置),WeatherData对象(用来追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看)。WeatherData对象知道如何根物理气象站联系,以取得更新信息。WeatherData对象会随机更新三个布告板的显示:目前状况(温度,湿度,气压)、气象统计和天气预报。我们的工作是建立一个 应用,利用WeatherData对象取得数据,并更新三个布告板:目前状况、气象统计和天气预报。
## 设计UML:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c5458d24140.jpg)
## 代码实现及执行结果:
~~~
#include
#include
';
-
using namespace std;
//以下是观察者和主题的基类,其中DisplayElement是一个抽象类,用来//使子类实现显示功能
classObserver
{
public:
virtual ~Observer(){};
virtual void update(float temp, floathumidity, float pressure){};
};
classDisplayElement
{
public:
virtual ~DisplayElement(){};
virtual voiddisplay() = 0;
};
classSubject
{
public:
virtual ~Subject(){};
virtual voidregsiterObserver(Observer* o){} ;
virtual voidremoveObserver(Observer* o){};
virtual voidnotifyObserver(){};
};
//以下是WeatherData类,实现了注册,删除和通知观察者的功能。
classWeatherData : public Subject
{
public:
void regsiterObserver(Observer* o)
{
observers.push_back(o);
}
void removeObserver(Observer* o)
{
observers.remove(o);
}
void notifyObservers()
{
list