C++观察者模式

it2026-01-13  6

观察者模式:     定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有的 观察者对象,使他们能够自动更新自己。 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++ 实现观察者模式小例子
最新回复(0)