当前位置: 首页 > web >正文

观察者模式(Observer Pattern)

🧠 观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式。它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。通常用于事件驱动的编程场景中。


🎯 为什么需要观察者模式?

  1. 松耦合设计:对象之间的耦合度降低。一个对象状态变化时,其他依赖它的对象自动更新,无需直接调用。
  2. 动态关系:当系统中存在多个“观察者”时,观察者可以在运行时动态添加或删除,不需要改动主体(被观察者)对象。
  3. 事件驱动:用于多方协作的场景,如GUI中的按钮点击、消息推送等。

优缺点分析

优点缺点
减少了对象之间的耦合度,方便扩展如果观察者过多,通知开销可能较大
支持动态注册和撤销观察者可能导致过多的通知,影响性能
增加新的观察者不需要修改主题类(符合开放-封闭原则)观察者与被观察者之间存在依赖关系,状态变化可能较为复杂

🧩 Python 示例:天气预报系统

假设我们有一个天气预报系统,其中天气站作为被观察者,而温度显示板湿度显示板等作为观察者。天气站的状态变化时,它会通知所有的观察者来更新它们的状态。


🎯 1️⃣ 观察者接口(Observer)

from abc import ABC, abstractmethodclass Observer(ABC):@abstractmethoddef update(self, temperature: float, humidity: float):pass
  • Observer 是一个接口,所有观察者类都需要实现 update() 方法来接收来自被观察者的通知。

🎯 2️⃣ 被观察者接口(Subject)

class Subject(ABC):@abstractmethoddef register_observer(self, observer: Observer):pass@abstractmethoddef remove_observer(self, observer: Observer):pass@abstractmethoddef notify_observers(self):pass
  • Subject 类是被观察者接口。它提供了 register_observer()remove_observer()notify_observers() 方法来管理观察者。

🎯 3️⃣ 具体被观察者类(WeatherStation)

class WeatherStation(Subject):def __init__(self):self._observers = []self._temperature = 0self._humidity = 0def register_observer(self, observer: Observer):self._observers.append(observer)def remove_observer(self, observer: Observer):self._observers.remove(observer)def notify_observers(self):for observer in self._observers:observer.update(self._temperature, self._humidity)def set_weather(self, temperature: float, humidity: float):self._temperature = temperatureself._humidity = humidityself.notify_observers()
  • WeatherStation 继承自 Subject 类,管理观察者并通知它们。
  • set_weather() 方法用于设置新的天气数据并通知所有注册的观察者。

🎯 4️⃣ 具体观察者类(TemperatureDisplay, HumidityDisplay)

class TemperatureDisplay(Observer):def update(self, temperature: float, humidity: float):print(f"Temperature updated: {temperature}°C")class HumidityDisplay(Observer):def update(self, temperature: float, humidity: float):print(f"Humidity updated: {humidity}%")
  • TemperatureDisplayHumidityDisplay 实现了 Observer 接口,在 update() 方法中接收天气站的状态变化并更新自己的显示内容。

🎯 5️⃣ 客户端代码(模拟天气变化)

# 创建被观察者(天气站)
weather_station = WeatherStation()# 创建观察者
temp_display = TemperatureDisplay()
humidity_display = HumidityDisplay()# 注册观察者
weather_station.register_observer(temp_display)
weather_station.register_observer(humidity_display)# 更新天气数据并通知观察者
weather_station.set_weather(25, 60)  # 设置温度为25°C,湿度为60%
weather_station.set_weather(30, 65)  # 设置温度为30°C,湿度为65%

输出结果

Temperature updated: 25°C
Humidity updated: 60%
Temperature updated: 30°C
Humidity updated: 65%

🧭 类图(Mermaid)

管理
«interface»
Observer
+update(temperature: float, humidity: float)
«interface»
Subject
+register_observer(observer: Observer)
+remove_observer(observer: Observer)
+notify_observers()
WeatherStation
-observers
-temperature
-humidity
+register_observer(observer: Observer)
+remove_observer(observer: Observer)
+notify_observers()
+set_weather(temperature: float, humidity: float)
TemperatureDisplay
+update(temperature: float, humidity: float)
HumidityDisplay
+update(temperature: float, humidity: float)

🧭 流程图(Mermaid)

User WeatherStation TempDisplay HumidityDisplay set_weather(25, 60) update(25, 60) update(25, 60) set_weather(30, 65) update(30, 65) update(30, 65) User WeatherStation TempDisplay HumidityDisplay

🧠 应用场景总结

场景示例
事件驱动应用GUI应用,按钮点击等事件通知其他组件
状态变化通知监控系统中的报警通知,状态变化
多方协作即时通讯应用中的信息广播
更新同步新闻推送,系统消息广播等

总结口诀

观察者模式
一个目标对象(被观察者)发生变化时,所有依赖于它的对象(观察者)都会自动更新。
✅ 适用于多方协作、状态变化广播等场景。


如果你有任何问题,或者想要更复杂的场景示例(比如消息队列、推送系统等),请告诉我!

http://www.xdnf.cn/news/4088.html

相关文章:

  • 解锁DeepSeek模型微调:从小白到高手的进阶之路
  • 【AND-OR-~OR锁存器设计】2022-8-31
  • AfuseKt2.4.2 | 支持阿里云盘、Alist等平台视频播放,具备自动海报墙刮削功能的强大播放器
  • GEMM inTriton (Split-K and Stream-K)
  • 经典的 Masked + Self-supervised learning 的模型方法
  • 学习路线(视觉)
  • Deep-Live-Cam-实时换脸开源部署和使用
  • sqli-labs靶场11-17关(POST型)
  • 小白学习java第16天(下):javaweb
  • 【C/C++】inline关键词
  • 第六章:6.1 ESP32教学:多任务处理与FreeRTOS实战
  • 谷歌SMR测试环境搭建
  • Spring 框架中 @Configuration 注解详解
  • Springboot循环依赖
  • FOC算法开环控制基础
  • Java开发者面试实录:微服务架构与Spring Cloud的应用
  • 学习黑客Nmap 原理
  • 什么是外联模板(extern template)?
  • 【阿里云大模型高级工程师ACP学习笔记】2.9 大模型应用生产实践 (下篇)
  • C++竞赛指南
  • 搜索速度迅猛,能在0.001秒内迅速找到文件,但遗憾的是,该软件已经停止更新
  • 前端- ElementPlus入门
  • yolov11 epoch100轮 训练笔记5 kaggle comet
  • Android学习总结之GetX库篇(优缺点)
  • 进程的程序替换——exec系列函数的使用
  • 效整理文件信息!一键生成文件夹目录的工具
  • 8.渐入佳境 -- 域名及网络地址
  • Unity:Surface Effector 2D(表面效应器 2D)
  • OSE2.【Linux】练习:查找项目的main函数入口
  • 开元类双端互动组件部署实战全流程教程(第3部分:UI资源加载机制与界面逻辑全面解析