avatar

刘刚刚的blog

采菊东篱下,悠然见南山🦥

  • 首页
  • 大模型应用
  • 常用软件/工具
  • Halo
  • 关于
Home HeadFirst 设计模式--观察者模式(Observer Pattern)
文章

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

Posted 2022-07-18 Updated 2024-09- 27
By Administrator
4~6 min read

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


简介

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


Head First设计模式
设计模式
License:  CC BY 4.0
Share

Further Reading

Dec 29, 2022

HeadFirst 设计模式--命令模式

命令模式通过封装调用把方法封装起来。

Dec 18, 2022

HeadFirst 设计模式--外观模式(Facade Pattern)

外观模式将一个或者数个类复杂的一切都隐藏在背后,只露出一个干净的外观

Dec 14, 2022

HeadFirst 设计模式--适配器模式(Adapter Design Pattern)

适配器模式将一个接口转化为另外一个接口。

OLDER

python中的time模块

NEWER

HeadFirst 设计模式--装饰者模式(Decorator Pattern)

Recently Updated

  • 文本切分-语义分割(Semantic Chunking)
  • dify 并发配置优化
  • Typing
  • 大模型返回中json_schema与json_mode的区别
  • Async

Trending Tags

Halo 运维 postgresql 设计模式 linux就该这么学 nas rag odoo python 文本切分

Contents

©2025 刘刚刚的blog. Some rights reserved.

Using the Halo theme Chirpy