C++观察者模式
观察者模式:
定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有的
观察者对象,使他们能够自动更新自己。
UML图:

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。两个对象之间松耦合,但是依然交互,不太清楚对方的具体细节。
就是不会像前面的策略模式一样,一个类对象中包含了另外一个对象。
对于观察者的一切,主题(Subject)只知道观察者实现了某个接口。主题不需要知道观察者的具体类是谁、做了些什么或者其它的细节。
主题类中仅包含了观察者的列表,可以对观察者进行添加或者删除。
其实好的C++代码:都是为了交互对象之间的松耦合设计而努力。
C++ 实现:
subject.h
#ifndef SUBJECT_H#define SUBJECT_H#include<list>classObserver;classSubject{protected:std::list<Observer*> observers;public:virtualvoid registerObserver(Observer*observer);virtualvoid removeObserver(Observer*observer);virtualvoid notify(){}};classWeatherDate:publicSubject{private:int temperature;int pressure;int humidity;public:WeatherDate(){temperature=0;pressure=0;humidity=0;}void setWeather(int,int,int);virtualvoid notify();};#endif
subject.cpp
#include"subject.h"#include"observer.h"classObserver;voidSubject::registerObserver(Observer*observer){observers.push_back(observer);}voidSubject::removeObserver(Observer*observer){std::list<Observer*>::iterator iter=observers.begin();for(;iter!=observers.end();iter++){if(*iter==observer){observers.erase(iter);break;}}}voidWeatherDate::notify(){std::list<Observer*>::iterator iter=observers.begin();for(;iter!=observers.end();iter++){(*iter)->update(temperature,pressure,humidity);}}voidWeatherDate::setWeather(int _temperature,int _pressure,int _humidity ){temperature=_temperature;pressure=_pressure;humidity=_humidity;}
observer.h
#ifndef OBSERVER_H#define OBSERVER_HclassSubject;classObserver{private:Subject* subject;public:virtualvoid update(int,int,int);virtualvoid unregister();Observer(Subject*subj);};#endif
observer.cpp
#include"observer.h"#include"subject.h"#include<iostream>classSubject;voidObserver::update(int temperature,int pressure,int humidity ){std::cout<<"temperature: "<<temperature<<std::endl;std::cout<<"pressure: "<<pressure<<std::endl;std::cout<<"humidity: "<<humidity<<std::endl;}Observer::Observer(Subject*subj){this->subject=subj;subject->registerObserver(this);}voidObserver::unregister(){subject->removeObserver(this);}
main.cpp
#include"subject.h"#include"observer.h"int main(){WeatherDate data;data.setWeather(30,100,200);Observer obser(&data);data.notify();}
上面的代码就是实现一个气象站的功能。
气象站当然有很多的观察者,当气温或者湿者之类的有变动,就需要通知对应的观察者。
附件列表
浙公网安备 33010602011771号