-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObserver.cpp
More file actions
117 lines (101 loc) · 2.61 KB
/
Observer.cpp
File metadata and controls
117 lines (101 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
class Observer
{
public:
virtual void update(float temp, float humidity, float pressure)=0;
};
class Subject
{
public:
virtual void registerObserver(Observer* o)=0;
virtual void removeObserver(Observer* o)=0;
virtual void notifyObservers()=0;
};
class DisplayElement
{
virtual void display()=0;
};
class WeaterData:public Subject
{
vector<Observer*> observers;
float temperature;
float humidity;
float pressure;
public:
virtual void registerObserver(Observer* o)
{
observers.push_back(o);
}
virtual void removeObserver(Observer* o)
{
vector<Observer*>::iterator it = find(observers.begin(), observers.end(), o); //查找
if(it!=observers.end())observers.erase(it);
}
virtual void notifyObservers()
{
for(vector<Observer*>::iterator it=observers.begin();it!=observers.end();it++)
{
(*it)->update(temperature, humidity, pressure);
}
}
void measurementChange()
{
notifyObservers();
}
void setMeasurement(float temp, float humidity, float pressure)
{
this->temperature=temp;
this->humidity = humidity;
this->pressure = pressure;
measurementChange();
}
};
class CurrentConditionsDisplay:public Observer, DisplayElement
{
float temperature;
float humidity;
virtual void update(float temp, float humidity, float pressure)
{
this->temperature = temp;
this->humidity = humidity;
display();
}
virtual void display()
{
cout<<"Current Conditions: "<<temperature<<"F degrees and "<<humidity<<"% humidity\n";
}
};
class StatisticsDisplay:public Observer, DisplayElement
{
float temperature;
float humidity;
float pressure;
virtual void update(float temp, float humidity, float pressure)
{
this->temperature = temp;
this->humidity = humidity;
this->pressure = pressure;
display();
}
virtual void display()
{
cout<<"Statistics: "<<temperature<<"F degrees and "<<humidity<<"% humidity and "<<pressure<<" pressure\n";
}
};
int main()
{
WeaterData weaterData;
CurrentConditionsDisplay CurrentDisplay;
weaterData.registerObserver(&CurrentDisplay);
weaterData.setMeasurement(30,13,22);
StatisticsDisplay statistics;
weaterData.registerObserver(&statistics);
weaterData.setMeasurement(100,13.1,220);
weaterData.removeObserver(&CurrentDisplay);
weaterData.setMeasurement(100.1,14.1,320);
}