Headfirst设计模式的C++实现——观察者模式(Observer)


WeatherData.h

 1 #ifndef WEATHERDATA_H_INCLUDED
2 #define WEATHERDATA_H_INCLUDED
3
4 #include <set>
5 #include "Display.h"
6
7 class WeatherData
8 {
9 public:
10 void measurementsChanged();
11 void registerObserver( Display *p_display );
12 void removeObserver( Display *p_display );
13
14 private:
15 int getTemperature() { return 25; }
16 int getHumidity() { return 90; }
17 int getPressure() { return 120; }
18
19 std::set<Display *> m_p_displays;
20 };
21
22 #endif // WEATHERDATA_H_INCLUDED

 

WeatherData.cpp

 1 #include "WeatherData.h"
2
3 void WeatherData::measurementsChanged()
4 {
5 for ( std::set<Display *>::iterator it = m_p_displays.begin(); it != m_p_displays.end(); it++ )
6 {
7 (*it)->update( getTemperature(), getHumidity(), getPressure() );
8 }
9 }
10
11 void WeatherData::registerObserver( Display *p_display )
12 {
13 m_p_displays.insert( p_display );
14 }
15
16 void WeatherData::removeObserver( Display *p_display )
17 {
18 m_p_displays.erase( p_display );
19 }

 

Display.h

 1 #ifndef DISPLAY_H_INCLUDED
2 #define DISPLAY_H_INCLUDED
3
4 class Display
5 {
6 public:
7 virtual void update( int temp, int humidity, int pressure ) = 0;
8 };
9
10 #endif // DISPLAY_H_INCLUDED

 

CurrentConditionsDisplay.h

 1 #ifndef CURRENTCONDITIONSDISPLAY_H_INCLUDED
2 #define CURRENTCONDITIONSDISPLAY_H_INCLUDED
3
4 #include <iostream>
5 #include "Display.h"
6
7 class CurrentConditionsDisplay : public Display
8 {
9 public:
10 void update( int temp, int humidity, int pressure ) { std::cout << "CurrentConditionsDisplay " << temp << "-" << humidity << "-" << pressure << std::endl; }
11 };
12
13 #endif // CURRENTCONDITIONSDISPLAY_H_INCLUDED

 

StatisticsDisplay.h

 1 #ifndef STATISTICSDISPLAY_H_INCLUDED
2 #define STATISTICSDISPLAY_H_INCLUDED
3
4 #include <iostream>
5 #include "Display.h"
6
7 class StatisticsDisplay : public Display
8 {
9 public:
10 void update( int temp, int humidity, int pressure ) { std::cout << "StatisticsDisplay " << temp << "-" << humidity << "-" << pressure << std::endl; }
11 };
12
13
14 #endif // STATISTICSDISPLAY_H_INCLUDED

 

ForcastDisplay.h

 1 #ifndef FORCASTDISPLAY_H_INCLUDED
2 #define FORCASTDISPLAY_H_INCLUDED
3
4 #include <iostream>
5 #include "Display.h"
6
7 class ForcastDisplay : public Display
8 {
9 public:
10 void update( int temp, int humidity, int pressure ) { std::cout << "ForcastDisplay " << temp << "-" << humidity << "-" << pressure << std::endl; }
11 };
12
13 #endif // FORCASTDISPLAY_H_INCLUDED

 

main.cpp

 1 #include "WeatherData.h"
2 #include "CurrentConditionsDisplay.h"
3 #include "StatisticsDisplay.h"
4 #include "ForcastDisplay.h"
5
6 int main()
7 {
8 WeatherData weather_data;
9
10 CurrentConditionsDisplay current_conditions_display;
11 StatisticsDisplay statistics_display;
12 ForcastDisplay forcast_display;
13
14 weather_data.registerObserver( &current_conditions_display );
15 weather_data.registerObserver( &statistics_display );
16 weather_data.registerObserver( &forcast_display );
17
18 weather_data.measurementsChanged();
19
20 weather_data.removeObserver( &statistics_display );
21
22 weather_data.measurementsChanged();
23
24 return 0;
25 }

 

本站声明
本文转载自:http://www.cnblogs.com/ren-yu/p/4940925.html     作者:Ren.Yu     发布日期:2015-11-05     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2016 ITdaan.com 粤ICP备14056181号