define对象间的一种一对多依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。
- 当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时
- 当一个对象必须通知其他对象,但它又不能假定其他对象是谁时
- Subject(主题):知道它的观察者,可以有任意多个观察者观察同一个主题;提供注册和删除观察者对象的接口
- Observer(观察者):为那些在主题发生改变时需要获得通知的对象定义一个更新接口
- ConcreteSubject(具体主题):将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知
- ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与主题的状态保持一致;实现Observer的更新接口以使自身状态与主题的状态保持一致
本示例采用经典的"气象站"场景:
- 气象数据中心(WeatherData)作为Subject,负责收集温度、湿度、气压等数据
- 多个布告板(CurrentConditionsDisplay、StatisticsDisplay)作为Observer,自动接收气象数据更新并显示
对应关系:
Subject接口 → 主题契约WeatherData→ 具体主题(气象数据中心)Observer接口 → 观察者契约CurrentConditionsDisplay→ 具体观察者(当前状况布告板)StatisticsDisplay→ 具体观察者(统计布告板)
- Python 3.10+
python weather_station.py当前状况:80.0°F,湿度 65.0%
统计:平均/最大/最小 = 80.0/80.0/80.0
当前状况:82.0°F,湿度 70.0%
统计:平均/最大/最小 = 81.0/82.0/80.0
当前状况:78.0°F,湿度 90.0%
统计:平均/最大/最小 = 80.0/82.0/78.0
