刘刚刚的个人博客

HeadFirst 设计模式--观察者模式(Observer Pattern)

创建时间:2022-07-10 00:58:46
更新时间:2022-07-10 00:58:46

有种消息队列,生成者+消费者的感觉

简介

subject(主题) + observer(观察者) = 观察者模式

在观察者模式中,主题对象管理某些数据,观察者可以订阅主题,当主题对象的数据发生改变的时候,就通知订阅了该subject的观察者。

以下代码,根据《head first 设计模式》中的java案例使用python进行实现。
需求:

  1. 有1个WeatherData类,可以获取到当前的天气的温度、湿度、气压
  2. 有1个WeatherObserver类,当WeatherData类的数据变化时,可以接受到通知,并输出相关的信息

观察者模式的相关介绍:

  1. subject一般常见的属性或者方法:

    • 一个数组属性,用来存储订阅了该subject的observer对象的列表
    • setchanged方法,用来表示当前是否需要进行通知,防止数据变化过小时,也一直通知
    • notifyObserver方法,用来通知订阅者
  2. 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

我的名片

昵称:shuta

职业:后台开发(python、php)

邮箱:648949076@qq.com

站点信息

建站时间: 2020/2/19
网站程序: ANTD PRO VUE + TP6.0
晋ICP备18007778号