使用观察者模式设计程序模拟李先生希望及时知道湖南气象站的天气预报,比如最高气温和最低气温等,同时希望及时知道旅行社的旅游信息。 要求:采用拉数据的方式
时间: 2023-12-03 17:44:46 浏览: 45
观察者模式可以用于实现这个功能。在这个模式中,存在一个主题(Subject),它维护着一组观察者(Observer),并且当主题的状态发生改变时会通知所有观察者。
在本题中,湖南气象站和旅行社都是主题,而李先生是观察者。当气象站发布了新的天气预报或旅行社发布了新的旅游信息时,李先生需要及时知道。
下面是一个使用拉数据的观察者模式的示例代码:
```python
from typing import List
class Subject:
def __init__(self):
self._observers = []
self._weather_data = {}
self._travel_data = {}
def register_observer(self, observer):
self._observers.append(observer)
def remove_observer(self, observer):
self._observers.remove(observer)
def notify_observers(self):
for observer in self._observers:
observer.update(self)
def set_weather_data(self, data):
self._weather_data = data
self.notify_observers()
def get_weather_data(self):
return self._weather_data
def set_travel_data(self, data):
self._travel_data = data
self.notify_observers()
def get_travel_data(self):
return self._travel_data
class Observer:
def update(self, subject: Subject):
pass
class LiXianSheng(Observer):
def update(self, subject: Subject):
weather_data = subject.get_weather_data()
travel_data = subject.get_travel_data()
# 拉取天气数据
highest_temperature = weather_data.get('highest_temperature')
lowest_temperature = weather_data.get('lowest_temperature')
print(f"李先生收到了最新的天气预报:最高气温 {highest_temperature} 度,最低气温 {lowest_temperature} 度。")
# 拉取旅游数据
destination = travel_data.get('destination')
date = travel_data.get('date')
print(f"李先生收到了最新的旅游信息:目的地 {destination},出发日期 {date}。")
class HunanWeatherStation(Subject):
def __init__(self):
super().__init__()
class TravelAgency(Subject):
def __init__(self):
super().__init__()
# 示例程序
if __name__ == '__main__':
# 创建主题
weather_station = HunanWeatherStation()
travel_agency = TravelAgency()
# 创建观察者
li_xian_sheng = LiXianSheng()
# 注册观察者
weather_station.register_observer(li_xian_sheng)
travel_agency.register_observer(li_xian_sheng)
# 更新天气数据和旅游数据
weather_station.set_weather_data({'highest_temperature': 30, 'lowest_temperature': 20})
travel_agency.set_travel_data({'destination': '张家界', 'date': '2021-08-01'})
```
在这个示例中,观察者 LiXianSheng 实现了 update 方法,每当 WeatherStation 或 TravelAgency 更新数据时,它会拉取最新的数据并进行处理。主题 WeatherStation 和 TravelAgency 继承了 Subject 类,实现了 register_observer、remove_observer、notify_observers 等方法,用于维护观察者列表并通知观察者。最后,在示例程序中,我们创建了一个 HunanWeatherStation 和一个 TravelAgency,以及一个 LiXianSheng 观察者,并将 LiXianSheng 注册到了两个主题上。当更新天气数据和旅游数据时,LiXianSheng 会收到通知并拉取最新的数据。