HeadFirst 设计模式--观察者模式(Observer Pattern)
有种消息队列,生成者+消费者的感觉
简介
subject(主题) + observer(观察者) = 观察者模式
在观察者模式中,主题对象管理某些数据,观察者可以订阅主题,当主题对象的数据发生改变的时候,就通知订阅了该subject的观察者。
以下代码,根据《head first 设计模式》中的java案例使用python进行实现。
需求:
有1个WeatherData类,可以获取到当前的天气的温度、湿度、气压
有1个WeatherObserver类,当WeatherData类的数据变化时,可以接受到通知,并输出相关的信息
观察者模式的相关介绍:
subject一般常见的属性或者方法:
一个数组属性,用来存储订阅了该subject的observer对象的列表
setchanged方法,用来表示当前是否需要进行通知,防止数据变化过小时,也一直通知
notifyObserver方法,用来通知订阅者
observer的常用属性:
update 当subject需要进行通知时,会调用订阅者的该方法
python代码实现
class WeatherData:
"""
subject类
"""
observers = []
temperature = None
humidity = None
pressure = None
is_changed = False
def set_changed(self):
self.is_changed = True
def notify_observers(self):
for o in self.observers:
o.update(self)
def measurements_changed(self):
self.set_changed()
self.notify_observers()
def set_measurements(self, temperature, humidity, pressure):
self.temperature = temperature
self.humidity = humidity
self.pressure = pressure
self.measurements_changed()
class WeatherObserver:
"""
observer类
"""
temperature = None
humidity = None
pressure = None
def update(self, obj):
self.temperature = obj.temperature
self.humidity = obj.humidity
self.pressure = obj.pressure
self.display()
def display(self):
res = f"""当前温度:{self.temperature},当前湿度:{self.humidity},当前气压:{self.pressure}"""
print(res)
# 测试demo
weather_subject = WeatherData()
weather_observer = WeatherObserver()
weather_subject.observers.append(weather_observer)
weather_subject.set_measurements(30,60,1)
当前温度:30,当前湿度:60,当前气压:1
License:
CC BY 4.0