82观察者设计模式
# 主题(被观察者)接口 class Subject: def register_observer(self, observer): pass def remove_observer(self, observer): pass def notify_observers(self): pass # 观察者接口 class Observer: def update(self, temperature, humidity, pressure): pass # 具体主题:气象站 class WeatherStation(Subject): def __init__(self): self.observers = [] self.temperature = 0 self.humidity = 0 self.pressure = 0 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.temperature, self.humidity, self.pressure) def measurements_changed(self): self.notify_observers() def set_measurements(self, temperature, humidity, pressure): self.temperature = temperature self.humidity = humidity self.pressure = pressure self.measurements_changed() # 具体观察者:手机显示 class MobileDisplay(Observer): def __init__(self, weather_station): self.weather_station = weather_station self.weather_station.register_observer(self) def update(self, temperature, humidity, pressure): self.temperature = temperature self.humidity = humidity self.display() def display(self): print(f"Mobile: {self.temperature}°C, {self.humidity}%") # 具体观察者:电视显示 class TVDisplay(Observer): def __init__(self, weather_station): self.weather_station = weather_station self.weather_station.register_observer(self) def update(self, temperature, humidity, pressure): self.temperature = temperature self.pressure = pressure self.display() def display(self): print(f"TV: {self.temperature}°C, {self.pressure}hPa") # 客户端代码 if __name__ == "__main__": # 创建气象站(主题) weather_station = WeatherStation() # 创建显示设备(观察者)并注册 mobile_display = MobileDisplay(weather_station) tv_display = TVDisplay(weather_station) # 更新气象数据(自动通知观察者) print("更新气象数据:") weather_station.set_measurements(25.5, 65, 1013) # 移除一个观察者 weather_station.remove_observer(tv_display) # 再次更新数据 print("\n更新气象数据 (移除TV显示后):") weather_station.set_measurements(28.0, 60, 1012) # 输出示例: # 更新气象数据: # Mobile: 25.5°C, 65% # TV: 25.5°C, 1013hPa # # 更新气象数据 (移除TV显示后): # Mobile: 28.0°C, 60%