# 主题(被观察者)接口
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%