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%

 

posted @ 2025-08-01 19:50  冷夜O  阅读(3)  评论(0)    收藏  举报