观察者Observer模式C++实现

观察者Observer模式C++实现观察者Observer模式C++实现Observer C++实现#include<string>

#include
<iostream>

#include
<set>



classIObserver;



classISubject

{

public:

virtualvoidregisterObserver(IObservero)=0;

virtualvoidremoveObserver(IObserver
o)=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(IObserver
o)

{

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;

ISubject
m_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()

{

CurrentConditionsDisplay
display1=newCurrentConditionsDisplay();

CurrentConditionsDisplay2
display2=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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午6:29
下一篇 2023年2月7日 下午6:29

相关推荐