Observer C++实现#include<string>
#include<iostream>
#include<set>
classIObserver;
classISubject
{
public:
virtualvoidregisterObserver(IObservero)=0;
virtualvoidremoveObserver(IObservero)=0;
virtualvoidnotifyObservers()=0;
};
classIObserver
{
protected:
IObserver(){};
public:
virtualvoidupdate(floattemp,floathumidity,floatpressure)=0;
};
classIDisplayElement
{
protected:
IDisplayElement(){};
public:
virtualvoiddisplay()=0;
};
typedef std::set<IObserver>ObserverList;
typedef std::set<IObserver>::iterator ObserverListIter;
classWeatherData:publicISubject
{
private:
ObserverList m_Oberservers;
floatm_temp;
floatm_humidity;
floatm_pressure;
public:
WeatherData () {};
~WeatherData () {};
virtualvoidregisterObserver(IObservero)
{
m_Oberservers.insert(o);
}
virtualvoidremoveObserver(IObservero)
{
ObserverListIter iter=m_Oberservers.find(o);
if(iter!=m_Oberservers.end())
{
m_Oberservers.erase(iter);
}
}
virtualvoidnotifyObservers()
{
ObserverListIter iter=m_Oberservers.begin();
for(;iter!=m_Oberservers.end();iter++)
{
//notify All Observers
IObserverpObserver=static_cast<IObserver>(iter);
pObserver->update(m_temp,m_humidity,m_pressure);
}
}
voidmeasurementsChanged()
{
notifyObservers();
}
voidsetMeasurements(floattemp,floathumidity,floatpressure)
{
m_temp=temp;
m_humidity=humidity;
m_pressure=pressure;
measurementsChanged();
}
};
classCurrentConditionsDisplay:publicIObserver,publicIDisplayElement
{
floatm_temp;
floatm_humidity;
ISubjectm_WeatherData;
public:
virtualvoidupdate(floattemp,floathumidity,floatpressure)
{
m_temp=temp;
m_humidity=humidity;
display();
}
virtualvoiddisplay()
{
std::cout<<"Current Conditions:"<<m_temp<<","
<<m_humidity<<std::endl;
}
};
classCurrentConditionsDisplay2:publicIObserver,publicIDisplayElement
{
floatm_temp;
floatm_humidity;
floatm_pressure;
public:
virtualvoidupdate(floattemp,floathumidity,floatpressure)
{
m_temp=temp;
m_humidity=humidity;
m_pressure=pressure;
display();
}
virtualvoiddisplay()
{
std::cout<<"Current Conditions2:"<<m_temp<<","
<<m_humidity<<","<<m_pressure<<std::endl;
}
};
intmain()
{
CurrentConditionsDisplaydisplay1=newCurrentConditionsDisplay();
CurrentConditionsDisplay2display2=newCurrentConditionsDisplay2();
WeatherData*data=newWeatherData();
data->registerObserver( display1);
data->registerObserver (display2);
data->setMeasurements(100,0,200);
data->setMeasurements(50,50,500);
data->removeObserver(display1);
data->setMeasurements(10,10,10);
getchar();
return0;
}
原文链接: https://www.cnblogs.com/mumuliang/archive/2010/11/24/1886243.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/17825
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!