【Python设计模式12】观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象在一个主题对象的状态发生变化时能够自动接收到通知并更新。观察者模式在很多场景下非常有用,比如事件驱动系统、模型-视图-控制器(MVC)模式等。

观察者模式的结构

观察者模式主要包含以下几个角色:

  1. 主题(Subject):被观察的对象,维护一个观察者列表,当自身状态发生变化时通知所有观察者。
  2. 观察者(Observer):定义一个更新接口,主题在状态发生变化时调用该接口以通知观察者。
  3. 具体主题(ConcreteSubject):实现主题接口,包含具体的状态,并在状态发生变化时通知所有观察者。
  4. 具体观察者(ConcreteObserver):实现观察者接口,接收到通知后更新自身状态。

观察者模式的示例

假设我们有一个气象站系统,气象站会实时更新温度数据,并通知多个显示设备(如手机、电脑、电视)显示最新的温度数据。

定义主题和观察者接口
python 复制代码
from abc import ABC, abstractmethod

class Observer(ABC):
    @abstractmethod
    def update(self, temperature: float):
        pass

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
定义具体主题
python 复制代码
class WeatherStation(Subject):
    def __init__(self):
        self._observers = []
        self._temperature = None

    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)

    def set_temperature(self, temperature: float):
        self._temperature = temperature
        self.notify_observers()
定义具体观察者
python 复制代码
class PhoneDisplay(Observer):
    def update(self, temperature: float):
        print(f"Phone display: Current temperature is {temperature}°C")

class ComputerDisplay(Observer):
    def update(self, temperature: float):
        print(f"Computer display: Current temperature is {temperature}°C")
使用观察者模式
python 复制代码
def main():
    weather_station = WeatherStation()

    phone_display = PhoneDisplay()
    computer_display = ComputerDisplay()

    weather_station.register_observer(phone_display)
    weather_station.register_observer(computer_display)

    weather_station.set_temperature(25)
    weather_station.set_temperature(30)

    weather_station.remove_observer(phone_display)
    weather_station.set_temperature(28)

if __name__ == "__main__":
    main()

在这个示例中,ObserverSubject是抽象类,定义了观察者和主题的接口。WeatherStation是具体主题,实现了主题接口,维护了一个观察者列表,并在温度变化时通知所有观察者。PhoneDisplayComputerDisplay是具体观察者,实现了观察者接口,在接收到通知后更新自己的显示。客户端通过注册、移除观察者,并设置温度来演示观察者模式的工作。

观察者模式的优缺点

优点
  1. 松耦合:观察者模式使得主题和观察者之间的耦合度降低,观察者只依赖于主题提供的接口,而不依赖于具体实现。
  2. 易于扩展:可以在运行时动态添加和移除观察者,方便系统的扩展。
  3. 符合开闭原则:可以在不修改主题类的情况下增加新的观察者类,符合开闭原则。
缺点
  1. 可能导致内存泄漏:如果观察者没有被正确移除,可能会导致内存泄漏。
  2. 通知开销:当有大量观察者时,通知所有观察者可能会导致性能问题。

观察者模式的适用场景

  1. 事件驱动系统:当一个事件的发生需要通知多个对象时,可以使用观察者模式。
  2. 模型-视图-控制器(MVC)模式:在MVC模式中,模型作为主题,视图作为观察者,当模型的状态发生变化时,通知所有视图进行更新。
  3. 订阅-发布系统:在发布-订阅系统中,发布者作为主题,订阅者作为观察者,当发布者发布新的消息时,通知所有订阅者。

总结

观察者模式是一种行为型设计模式,通过定义一对多的依赖关系,使得多个观察者对象在一个主题对象的状态发生变化时能够自动接收到通知并更新。观察者模式适用于事件驱动系统、MVC模式和订阅-发布系统等场景。合理应用观察者模式,可以提高系统的灵活性和可扩展性,降低对象之间的耦合度。理解和掌握观察者模式,有助于在实际开发中构建高效、灵活的系统。

相关推荐
孤狼warrior2 分钟前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat9966312 分钟前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威39 分钟前
农经权二轮延包—各种地块示意图
python·arcgis
ZH154558913141 分钟前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep1 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手1 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
喵手1 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
B站_计算机毕业设计之家1 小时前
猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 推荐算法 爬虫 大数据 毕业设计源码
python·机器学习·信息可视化·flask·毕业设计·echarts·推荐算法
PPPPPaPeR.1 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
JaydenAI1 小时前
[拆解LangChain执行引擎] ManagedValue——一种特殊的只读虚拟通道
python·langchain