📅  最后修改于: 2023-12-03 14:46:18.318000             🧑  作者: Mango
观察者模式是一种常用的设计模式,它用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在 Python 中,我们可以使用内置的 Observable
类和 Observer
类来实现观察者模式。
Observable
类是一个可观察的对象,每个对象都有一个 observers
属性,用于存放观察者对象。Observable
类有以下方法:
add_observer(observer)
:将一个观察者对象添加到 observers
列表中;remove_observer(observer)
:从 observers
列表中移除一个观察者对象;notify_observers(*args, **kwargs)
:通知所有观察者对象,调用它们的 update
方法。下面是一个 Observable
类的示例:
class Observable:
def __init__(self):
self.observers = []
def add_observer(self, observer):
if observer not in self.observers:
self.observers.append(observer)
def remove_observer(self, observer):
if observer in self.observers:
self.observers.remove(observer)
def notify_observers(self, *args, **kwargs):
for observer in self.observers:
observer.update(*args, **kwargs)
Observer
类是一个观察者对象,每个对象都有一个 observable
属性,用于存放它所观察的 Observable
对象。Observer
类有以下方法:
update(*args, **kwargs)
:处理 Observable
对象通知的信息。下面是一个 Observer
类的示例:
class Observer:
def __init__(self, observable):
self.observable = observable
self.observable.add_observer(self)
def update(self, *args, **kwargs):
raise NotImplementedError()
下面是一个示例,用于演示如何使用观察者模式。我们创建一个 WeatherData
类作为 Observable
类,创建几个观察者类作为 Observer
类。每当天气数据有更新时,WeatherData
对象会通知所有观察者对象,并调用它们的 update
方法,将最新的天气数据传递给它们。
class WeatherData(Observable):
def __init__(self):
super().__init__()
self.temperature = None
self.humidity = None
self.pressure = None
def set_measurements(self, temperature, humidity, pressure):
self.temperature = temperature
self.humidity = humidity
self.pressure = pressure
self.notify_observers(self.temperature, self.humidity, self.pressure)
class CurrentConditionsDisplay(Observer):
def __init__(self, observable):
super().__init__(observable)
def update(self, temperature, humidity, pressure):
print('Current conditions:', temperature, 'F degrees and', humidity, '% humidity')
class StatisticsDisplay(Observer):
def __init__(self, observable):
super().__init__(observable)
self.temperature_sum = self.temperature_num = 0
def update(self, temperature, humidity, pressure):
self.temperature_sum += temperature
self.temperature_num += 1
print('Average temperature:', self.temperature_sum / self.temperature_num, 'F degrees')
if __name__ == '__main__':
weather_data = WeatherData()
current_display = CurrentConditionsDisplay(weather_data)
statistics_display = StatisticsDisplay(weather_data)
weather_data.set_measurements(80, 65, 30.4)
weather_data.set_measurements(82, 70, 29.2)
weather_data.set_measurements(78, 90, 29.2)
输出:
Current conditions: 80 F degrees and 65 % humidity
Average temperature: 80.0 F degrees
Current conditions: 82 F degrees and 70 % humidity
Average temperature: 81.0 F degrees
Current conditions: 78 F degrees and 90 % humidity
Average temperature: 80.0 F degrees
在上面的示例中,我们创建了一个 WeatherData
类作为 Observable
类,它有 temperature
、humidity
和 pressure
三个属性,当它们有变化时,会调用 set_measurements
方法通知观察者对象。我们创建了两个观察者类 CurrentConditionsDisplay
和 StatisticsDisplay
,它们都实现了 update
方法,在调用时会根据最新的天气数据进行相应操作。最后,我们创建一个 WeatherData
对象,并将它的两个观察者对象传入,然后调用 set_measurements
方法几次,观察输出结果即可。