观察者模式:
定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有的
观察者对象,使他们能够自动更新自己。
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();}
上面的代码就是实现一个气象站的功能。
气象站当然有很多的观察者,当气温或者湿者之类的有变动,就需要通知对应的观察者。
null
附件列表
转载于:https://www.cnblogs.com/yml435/p/6945925.html
相关资源:C++ 实现观察者模式小例子