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_H
classSubject;
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();
}
上面的代码就是实现一个气象站的功能。
气象站当然有很多的观察者,当气温或者湿者之类的有变动,就需要通知对应的观察者。
附件列表