首页 > 编程语言 >Python中的观察者模式:从入门到精通

Python中的观察者模式:从入门到精通

时间:2024-09-12 22:52:27浏览次数:12  
标签:入门 observer Python self 观察者 observers ._ def

引言

观察者模式允许对象(称为“观察者”)注册到另一个对象(称为“主题”或“被观察者”),从而在主题状态改变时自动收到通知。这种机制使得多个观察者可以独立地响应同一个事件,增强了系统的灵活性和可维护性。特别是在构建高度解耦、易于扩展的应用程序时,观察者模式显得尤为重要。

基础语法介绍

核心概念

  • 主题(Subject):也称作被观察者,负责维护观察者列表,并在自身状态发生变化时通知所有注册的观察者。
    • 观察者(Observer):是一个对象,其唯一职责是在接收到通知后执行某些操作。

基本语法规则

在Python中实现观察者模式通常涉及到以下几个步骤:

  1. 定义一个主题类,该类需要提供添加、删除观察者的方法,以及一个用于通知所有观察者的方法。
    1. 创建具体的观察者类,它们实现了一个更新方法,当被主题调用时执行相应操作。
    1. 在适当的时候让观察者订阅(即向主题添加自己)或取消订阅(即从主题中移除自己)。

基础实例:天气预报系统

假设我们正在开发一款简单的天气预报应用,其中有一个天气数据源(作为主题)和多个显示设备(作为观察者)。每当天气信息发生变化时,所有连接的设备都应该同步更新自己的显示内容。

class WeatherData:
    def __init__(self):
        self._observers = []
        self._temperature = 0

    def register_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        self._observers.remove(observer)

    def notify_observers(self):
        for observer in self._observers:
            observer.update(self._temperature)

    def set_temperature(self, temperature):
        self._temperature = temperature
        self.notify_observers()

class DisplayDevice:
    def update(self, temperature):
        print(f"当前温度:{temperature}°C")

# 使用示例
weather_data = WeatherData()
display_device = DisplayDevice()
weather_data.register_observer(display_device)
weather_data.set_temperature(25)  # 输出: 当前温度:25°C

进阶实例:股票交易系统

接下来,让我们看看在更复杂的场景下如何应用观察者模式。例如,在一个股票交易系统中,我们需要实时监控多种股票价格变动,并根据不同用户的策略自动执行买卖操作。

问题描述

用户可以根据个人偏好设置不同的交易策略(如基于移动平均线、相对强弱指数等技术指标),当某只股票的价格达到预设条件时触发相应的交易行为。

高级代码实例

from abc import ABC, abstractmethod

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

    @abstractmethod
    def remove_observer(self, observer):
        pass

    @abstractmethod
    def notify_observers(self):
        pass

class RealStockExchange(StockExchange):
    def __init__(self):
        self._observers = []
        self._stock_prices = {}

    def register_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        self._observers.remove(observer)

    def notify_observers(self):
        for observer in self._observers:
            observer.update(self._stock_prices)

    def set_price(self, stock_symbol, price):
        self._stock_prices[stock_symbol] = price
        self.notify_observers()

class TradingStrategy(ABC):
    @abstractmethod
    def update(self, stock_prices):
        pass

class MovingAverageStrategy(TradingStrategy):
    def update(self, stock_prices):
        # 实现基于移动平均线的交易逻辑...
        print("根据移动平均线进行交易决策...")

# 使用示例
exchange = RealStockExchange()
strategy = MovingAverageStrategy()
exchange.register_observer(strategy)
exchange.set_price('AAPL', 150.23)  # 触发策略更新

实战案例:社交媒体平台的通知系统

在现实世界的应用中,观察者模式同样发挥着重要作用。比如,在设计社交媒体平台的通知系统时,我们可以利用这一模式来实现用户动态更新与即时推送功能。

问题描述

每当用户发布新内容或与其他用户互动时(如点赞、评论等),平台需要及时将这些信息推送给相关用户,确保他们能够第一时间了解到最新动态。

解决方案与代码实现

我们可以创建一个UserActivity类作为主题,用来存储用户的活动记录;同时定义若干个观察者类(如EmailNotifierPushNotificationService等),分别处理不同类型的通知方式。

class UserActivity:
    def __init__(self):
        self._observers = []

    def add_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        self._observers.remove(observer)

    def notify_observers(self, activity):
        for observer in self._observers:
            observer.send_notification(activity)

class EmailNotifier:
    def send_notification(self, activity):
        print(f"发送邮件通知:{activity}")

class PushNotificationService:
    def send_notification(self, activity):
        print(f"发送推送通知:{activity}")

# 使用示例
activity = UserActivity()
email_notifier = EmailNotifier()
push_service = PushNotificationService()
activity.add_observer(email_notifier)
activity.add_observer(push_service)
activity.notify_observers("张三发布了新照片")

扩展讨论

尽管我们已经介绍了观察者模式的基本原理及其在Python中的实现方式,但值得指出的是,该模式也有其局限性和适用范围。例如,在处理大量观察者时可能会导致性能问题;此外,在某些情况下,过度使用观察者模式可能会增加系统的复杂度。因此,在实际应用过程中,开发者需要权衡利弊,合理选择设计模式。

标签:入门,observer,Python,self,观察者,observers,._,def
From: https://blog.51cto.com/u_16918694/11993813

相关文章

  • python+flask计算机毕业设计基于的社会公益服务平台的设计与实现9iel49(程序+开题+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着信息技术的飞速发展,互联网已成为推动社会公益事业创新的重要力量。然而,传统公益模式在信息传播、资源调配、参与便捷性等方......
  • python+flask计算机毕业设计基于前后端分离的网上音乐推荐系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字音乐已成为人们日常生活中不可或缺的一部分。面对海量的音乐资源,用户如何快速准确地找到符合个人喜好的音乐......
  • python+flask计算机毕业设计基于智能推荐的宠物之家网站设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人们生活水平的提高,宠物已成为许多家庭不可或缺的重要成员。宠物市场的繁荣不仅体现在宠物数量的激增上,更在于宠物主......
  • 如何使用python中的math
    首先,导入math函数库。一、计算平方根输入一个数值,保存在变量n中。用函数sqrt,计算变量平方根的值。二、计算幂可以用函数exp,计算e的x次幂。三、计算对数设置两个数,保存在变量n和a中。接着,用log函数计算以a为基数n的对数。运行程序,其结果如下图所示。......
  • 如何查看python文档
    调用help函数,可以看到一个函数或者方法的字符串文档。In [1]: import requestsIn [2]: help(requests.get)Help on function get in module requests.api:get(url, params=None, **kwargs)    Sends a GET request.    :param url: URL fo......
  • Python中的装饰器:解锁代码的无限可能
    引言装饰器模式是Python中一种非常实用的设计模式,它允许我们在不修改原函数或类的基础上为其添加新的功能。这种非侵入式的方式不仅提高了代码的复用性,还使得程序更加模块化和易于维护。无论是进行权限校验、记录日志还是缓存计算结果等场景下,装饰器都能大显身手。基础语法介绍......
  • Python数据分析与可视化入门教程
    Python数据分析与可视化入门教程1.安装Python和必要库安装Python:从官方网站(DownloadPython|Python.org)下载并安装适合你操作系统的Python版本。建议安装最新稳定版本。安装库:使用pip命令安装常用的数据分析和可视化库:Bashpipinstallnumpypandasmatplotlibseab......
  • 计算机毕业设计选题推荐-基于Python框架项目推荐(上)
    博主介绍:✌十余年IT大项目实战经验、在某机构培训学员上千名、专注于本行业领域✌技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫+大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战项目。主要内容:系统功能设计、开题报告......
  • JavaScript语法入门五 常量
    常量声明一个常量就是声明一个常数。声明之后就不能修改(不能通过重新赋值进行修改)。使用const关键字。该关键字是ES6新增加的关键字。用const声明常量时,必须初始化。例子1:constmyBirthday='18.06.1981';例子2:<script> constPERSON='jack' {   constPERSON='tom' ......
  • 【Python使用】嘿马python基础入门全体系教程第9篇:高阶函数,函数应用:学生管理系统【附
    本教程的知识点为:计算机组成计算机是由什么组成的?1.硬件系统:2.软件系统:目标运算符的分类1.算数运算符2.赋值运算符3.复合赋值运算符判断语句和循环语句if嵌套1.if嵌套的格式2.if嵌套的应用if嵌套执行流程容器:字符串、列表、元组、字典字符串介绍一.认识字......