📜  python 观察者模式 - Python (1)

📅  最后修改于: 2023-12-03 14:46:18.318000             🧑  作者: Mango

Python 观察者模式

观察者模式是一种常用的设计模式,它用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在 Python 中,我们可以使用内置的 Observable 类和 Observer 类来实现观察者模式。

Observable 类

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 类

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 类,它有 temperaturehumiditypressure 三个属性,当它们有变化时,会调用 set_measurements 方法通知观察者对象。我们创建了两个观察者类 CurrentConditionsDisplayStatisticsDisplay,它们都实现了 update 方法,在调用时会根据最新的天气数据进行相应操作。最后,我们创建一个 WeatherData 对象,并将它的两个观察者对象传入,然后调用 set_measurements 方法几次,观察输出结果即可。