-
Notifications
You must be signed in to change notification settings - Fork 0
/
weatherData.go
99 lines (79 loc) · 2.61 KB
/
weatherData.go
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
package observer
// Интерфейс работы с измерениями.
type measurementsHandler interface {
MeasurementsChanged() string
SetMeasurements(float64, float64, float64) string
}
// WeatherDater Интерфейс источника метеоданных, способного быть субъектом.
type WeatherDater interface {
measurementsHandler
subject
}
// Источник метеоданных.
type weatherData struct {
changed bool
observers map[observer]struct{}
temperature float64
humidity float64
pressure float64
}
// MeasurementsChanged Вызывается при каждом обновлении показаний датчиков.
func (w *weatherData) MeasurementsChanged() string {
return w.NotifyObservers(nil)
}
// SetMeasurements Задать измерения.
func (w *weatherData) SetMeasurements(temperature, humidity, pressure float64) string {
w.temperature = temperature
w.humidity = humidity
w.pressure = pressure
return w.MeasurementsChanged()
}
// RegisterObserver Регистрация нового наблюдателя.
func (w *weatherData) RegisterObserver(newObserver observer) {
w.observers[newObserver] = struct{}{}
}
// RemoveObserver Удалить наблюдателя из списка.
func (w *weatherData) RemoveObserver(removedObserver observer) {
delete(w.observers, removedObserver)
}
// NotifyObservers Оповестить наблюдателей.
func (w *weatherData) NotifyObservers(data *Measurements) string {
var result string
if w.HasChanged() {
for currentObserver := range w.observers {
result += currentObserver.Update(w, data)
}
w.ClearChanged()
}
return result
}
// SetChanged Зафиксировать изменения.
func (w *weatherData) SetChanged() {
w.changed = true
}
// HasChanged Проверить фиксацию изменений.
func (w *weatherData) HasChanged() bool {
return w.changed
}
// ClearChanged Снять фиксацию изменений.
func (w *weatherData) ClearChanged() {
w.changed = false
}
// GetTemperature Получить текущую температуру.
func (w *weatherData) GetTemperature() float64 {
return w.temperature
}
// GetHumidity Получить текущую влажность.
func (w *weatherData) GetHumidity() float64 {
return w.humidity
}
// GetPressure Получить текущее давление.
func (w *weatherData) GetPressure() float64 {
return w.pressure
}
// NewWeatherData Создать weatherData.
func NewWeatherData() WeatherDater {
wd := new(weatherData)
wd.observers = make(map[observer]struct{})
return wd
}