|
1 | 1 | class Subject:
|
2 |
| - def register_observer(): |
| 2 | + def register_observer(self, observer): |
3 | 3 | raise NotImplementedError
|
4 | 4 |
|
5 |
| - def remove_observer(): |
| 5 | + def remove_observer(self, observer): |
6 | 6 | raise NotImplementedError
|
7 | 7 |
|
8 |
| - def notify_observers(): |
| 8 | + def notify_observers(self): |
9 | 9 | raise NotImplementedError
|
10 | 10 |
|
11 | 11 |
|
12 | 12 | class Observer:
|
13 |
| - def update(): |
| 13 | + def update(self, temp, humidity, pressure): |
14 | 14 | raise NotImplementedError
|
15 | 15 |
|
16 | 16 |
|
17 | 17 | class DisplayElement:
|
18 |
| - def display(): |
| 18 | + def display(self): |
19 | 19 | raise NotImplementedError
|
20 | 20 |
|
21 | 21 |
|
22 | 22 | class WeatherData(Subject):
|
23 | 23 | def __init__(self):
|
| 24 | + self._temperature = None |
| 25 | + self._humidity = None |
| 26 | + self._pressure = None |
24 | 27 | self._observers = []
|
25 | 28 |
|
26 | 29 | def register_observer(self, observer: Observer):
|
@@ -49,23 +52,80 @@ def __init__(self, weather_data):
|
49 | 52 |
|
50 | 53 | def display(self):
|
51 | 54 | print(
|
52 |
| - f"Current conditions: {self._temperature:.1f}F degrees and {self._humidity:.1f}% humidity" |
| 55 | + f"Current conditions: " |
| 56 | + f"{self._temperature:.1f}F degrees and " |
| 57 | + f"{self._humidity:.1f}% humidity" |
53 | 58 | )
|
54 | 59 |
|
55 |
| - def update(self, temperature: float, humidity: float, pressure: float): |
56 |
| - self._temperature = temperature |
| 60 | + def update(self, temp: float, humidity: float, pressure: float): |
| 61 | + self._temperature = temp |
57 | 62 | self._humidity = humidity
|
58 | 63 | self.display()
|
59 | 64 |
|
60 | 65 |
|
| 66 | +class StatisticsDisplay(DisplayElement, Observer): |
| 67 | + |
| 68 | + def __init__(self, weather_data): |
| 69 | + self._max_temp = 0. |
| 70 | + self._min_temp = 200. |
| 71 | + self._temp_sum = 0. |
| 72 | + self._num_readings = 0 |
| 73 | + self._weather_data = None |
| 74 | + self._weather_data = weather_data |
| 75 | + weather_data.register_observer(self) |
| 76 | + |
| 77 | + def update(self, temp, humidity, pressure): |
| 78 | + self._temp_sum += temp |
| 79 | + self._num_readings += 1 |
| 80 | + self._max_temp = max(temp, self._max_temp) |
| 81 | + self._min_temp = min(temp, self._min_temp) |
| 82 | + self.display() |
| 83 | + |
| 84 | + def display(self): |
| 85 | + print(f"Avg/Max/Min temperature = " |
| 86 | + f"{self._temp_sum / self._num_readings}" |
| 87 | + f"/{self._max_temp}" |
| 88 | + f"/{self._min_temp}" |
| 89 | + ) |
| 90 | + |
| 91 | + |
| 92 | +class ForecastDisplay(DisplayElement, Observer): |
| 93 | + |
| 94 | + def __init__(self, weather_data): |
| 95 | + self._current_pressure = 29.92 |
| 96 | + self._last_pressure = None |
| 97 | + self._weather_data = weather_data |
| 98 | + weather_data.register_observer(self) |
| 99 | + |
| 100 | + def update(self, temp, humidity, pressure): |
| 101 | + self._last_pressure = self._current_pressure |
| 102 | + self._current_pressure = pressure |
| 103 | + self.display() |
| 104 | + |
| 105 | + def display(self): |
| 106 | + print("Forecast: ", end="") |
| 107 | + if self._current_pressure > self._last_pressure: |
| 108 | + print("Improving weather on the way!") |
| 109 | + elif self._current_pressure == self._last_pressure: |
| 110 | + print("More of the same") |
| 111 | + elif self._current_pressure < self._last_pressure: |
| 112 | + print("Watch out for cooler, rainy weather") |
| 113 | + |
| 114 | + |
61 | 115 | def weather_station():
|
62 | 116 | weather_data = WeatherData()
|
| 117 | + |
63 | 118 | current_display = CurrentConditionsDisplay(weather_data)
|
64 |
| - # statistics_display = StatisticsDisplay(weather_data) |
| 119 | + statistics_display = StatisticsDisplay(weather_data) |
| 120 | + forecast_display = ForecastDisplay(weather_data) |
| 121 | + |
65 | 122 | weather_data.set_measurements(80, 65, 30.4)
|
66 | 123 | weather_data.set_measurements(82, 70, 29.2)
|
67 | 124 | weather_data.set_measurements(78, 90, 29.2)
|
68 | 125 |
|
| 126 | + weather_data.remove_observer(forecast_display) |
| 127 | + weather_data.set_measurements(62, 90, 28.1) |
| 128 | + |
69 | 129 |
|
70 | 130 | if __name__ == "__main__":
|
71 | 131 | weather_station()
|
0 commit comments