观察者模式(Observer Pattern)

发布于:2025-05-08 ⋅ 阅读:(11) ⋅ 点赞:(0)

🧠 观察者模式(Observer Pattern)

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


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

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

优缺点分析

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

🧩 Python 示例:天气预报系统

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


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

from abc import ABC, abstractmethod

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

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

class Subject(ABC):
    @abstractmethod
    def register_observer(self, observer: Observer):
        pass

    @abstractmethod
    def remove_observer(self, observer: Observer):
        pass

    @abstractmethod
    def notify_observers(self):
        pass
  • Subject 类是被观察者接口。它提供了 register_observer()remove_observer()notify_observers() 方法来管理观察者。

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

class WeatherStation(Subject):
    def __init__(self):
        self._observers = []
        self._temperature = 0
        self._humidity = 0

    def 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 = temperature
        self._humidity = humidity
        self.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应用,按钮点击等事件通知其他组件
状态变化通知 监控系统中的报警通知,状态变化
多方协作 即时通讯应用中的信息广播
更新同步 新闻推送,系统消息广播等

总结口诀

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


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


网站公告

今日签到

点亮在社区的每一天
去签到