观察者模式(Observer Pattern)
🧠 观察者模式(Observer Pattern)
观察者模式是一种行为型设计模式。它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。通常用于事件驱动的编程场景中。
🎯 为什么需要观察者模式?
- 松耦合设计:对象之间的耦合度降低。一个对象状态变化时,其他依赖它的对象自动更新,无需直接调用。
- 动态关系:当系统中存在多个“观察者”时,观察者可以在运行时动态添加或删除,不需要改动主体(被观察者)对象。
- 事件驱动:用于多方协作的场景,如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}%")
TemperatureDisplay
和HumidityDisplay
实现了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)
🧭 流程图(Mermaid)
🧠 应用场景总结
场景 | 示例 |
---|---|
事件驱动应用 | GUI应用,按钮点击等事件通知其他组件 |
状态变化通知 | 监控系统中的报警通知,状态变化 |
多方协作 | 即时通讯应用中的信息广播 |
更新同步 | 新闻推送,系统消息广播等 |
✅ 总结口诀
观察者模式:
✅ 一个目标对象(被观察者)发生变化时,所有依赖于它的对象(观察者)都会自动更新。
✅ 适用于多方协作、状态变化广播等场景。
如果你有任何问题,或者想要更复杂的场景示例(比如消息队列、推送系统等),请告诉我!