Observer C ++ implementation # Include < String >
# Include < Iostream >
# Include < Set >
ClassIobserver;
Class Isubject
{
Public :
Virtual Void Registerobserver (iobserver * O) = 0 ;
Virtual Void Removeobserver (iobserver * O) = 0 ;
Virtual Void Yyobservers () = 0 ;
};
class iobserver
{< br> protected :< br> iobserver () {};
Public :< br> virtual void Update ( float temp, float humidity, float pressure) = 0 ;
};
ClassIdisplayelement
{
Protected:
Idisplayelement (){};
Public:
Virtual VoidDisplay ()= 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 (){};
Virtual Void Registerobserver (iobserver * O)
{
M_oberservers.insert (O );
}
Virtual Void Removeobserver (iobserver * O)
{
Observerlistiter ITER = M_oberservers.find (O );
If (ITER ! = M_oberservers.end ())
{
M_oberservers.erase (ITER );
}
}
Virtual Void Yyobservers ()
{
Observerlistiter ITER = M_oberservers.begin ();
For (; ITER ! = M_oberservers.end (); ITER ++ )
{
// Policy all observers
Iobserver * Pobserver = Static_cast < Iobserver *> ( * ITER );
Pobserver -> Update (m_temp, m_humidity, m_pressure );
}
}
Void Measurementschanged ()
{
Yyobservers ();
}
Void Setmeasurements ( Float Temp, Float Humidity, Float Pressure)
{
M_temp = Temp;
M_humidity = Humidity;
M_pressure = Pressure;
Measurementschanged ();
}
};
ClassCurrentconditionsdisplay:PublicIobserver,PublicIdisplayelement
{
FloatM_temp;
FloatM_humidity;
Isubject*M_weatherdata;
Public:
Virtual VoidUpdate (FloatTemp,FloatHumidity,FloatPressure)
{
M_temp=Temp;
M_humidity=Humidity;
Display ();
}
Virtual Void Display ()
{
STD: cout < " Current conditions: " < M_temp < " , "
< M_humidity < STD: Endl;
}
};
ClassCurrentconditionsdisplay2:PublicIobserver,PublicIdisplayelement
{
FloatM_temp;
FloatM_humidity;
FloatM_pressure;
Public:
Virtual Void Update ( Float Temp, Float Humidity, Float Pressure)
{
M_temp = Temp;
M_humidity = Humidity;
M_pressure = Pressure;
Display ();
}
Virtual Void Display ()
{
STD: cout < " Current conditions2: " < M_temp < " , "
< M_humidity < " , " < M_pressure < STD: Endl;
}
};
int main ()
{< br> currentconditionsdisplay * display1 = New currentconditionsdisplay ();
currentconditionsdisplay2 * display2 = New currentconditionsdisplay2 ();
weatherdata * data = New weatherdata ();
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 ();
Return 0;
}