Python观察者模式介绍、使用方法

这篇具有很好参考价值的文章主要介绍了Python观察者模式介绍、使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Python观察者模式介绍

Python观察者模式是一种行为型设计模式,它将对象分成两个部分:观察者和主题。观察者在主题状态改变时被通知并且更新自己。

功能:

  • 通过解耦来实现可重用性和灵活性。
  • 提供了一种对象间的一对多依赖关系,当一个对象改变状态时,所有依赖对象都会收到通知。
  • 主题和观察者之间是松散耦合的,它们可以独立地改变。

优点:

  • 提供灵活性,减少类间的耦合度。
  • 可以实现动态的发布-订阅机制,并且观察者可在运行时动态地加入或离开主题。
  • 实现开放-封闭原则,使得主题和观察者可以独立地扩展和修改。

缺点:

  • 观察者过多会导致通知效率等性能问题。
  • 如果观察者与主题相互依赖,修改其中任意一方的代码都需要修改对方的代码,不利于系统的扩展和维护。

应用场景:

  • 当一个对象的改变需要同时改变其他对象时,比如消息订阅模型。
  • 当一个抽象模型有两个方面,其中一个方面需要依赖另外一个方面时。

使用方式:

  • 定义观察者类,包含需要执行的方法。
  • 定义主题类,包含观察者列表和通知观察者的方法。
  • 在主题类的方法中通知观察者。

在应用程序开发中的应用:

  • GUI界面中的控件更新。
  • 消息订阅模型。
  • 日志记录器。

二、观察者模式使用

工作原理:

  • 观察者将自己注册到主题中。
  • 主题维护一个观察者列表。
  • 当主题状态发生改变时,通知所有观察者。
  • 观察者执行相应的操作。

示例一:实现信息通知功能

假设我们要实现一个天气预报系统,当天气发生变化时,需要将信息通知给所有的观察者。这是一个常见的观察者模式的应用场景,下面举例详细说明 Python观察者模式的工作原理和使用方法。

首先,我们需要定义两个类:主题类和观察者类。主题类包含一个观察者列表和通知观察者的方法,观察者类包含需要执行的方法。WeatherSubject类为天气主题类,包含observers列表和register_observer、remove_observer、notify_observers、set_temperature等方法。WeatherObserver类为观察者类,包含name属性和update方法。在update方法中,观察者会执行相应的操作,例如打印收到通知的信息。

接下来,我们可以创建主题对象和观察者对象,并将观察者对象注册到主题对象中。创建了一个主题对象subject和两个观察者对象observer_1和observer_2,并将观察者对象注册到主题对象中。

现在,我们可以改变天气信息,然后通知所有的观察者。代码如下:

# *********************************观察者模式实现信息通知功能
# 主题类
class WeatherSubject():
    def __init__(self):
        self.observers = [] # 初始化观察者数组
        self.temperature = None # 初始化温度
    def register_observer(self, observer):
        self.observers.append(observer)

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

    def notify_observer(self):
        for observer in self.observers:
            observer.update(self.temperature) # 通知观察者温度

    def set_temperature(self, temperature):
        self.temperature = temperature # 设置温度
        self.notify_observer() # 通知观察者

# 观察者类
class WeatherObserver():
    def __init__(self, name):
        self.name = name
    def update(self, temperature):
        print(f"{self.name}收到温度通知:温度为{temperature}℃")

subject = WeatherSubject()

observer1 = WeatherObserver("name1")
observer2 = WeatherObserver("name2")

subject.register_observer(observer1)
subject.register_observer(observer2)

subject.set_temperature(20)

运行结果

name1收到温度通知:温度为20℃
name2收到温度通知:温度为20℃

在上述代码中,我们将温度设置为20℃,然后调用set_temperature方法通知所有的观察者。观察者会收到通知并执行相应的操作,例如打印收到通知的信息。

这就是 Python观察者模式的工作原理和使用方法。当主题状态发生变化时,通知所有的观察者,执行相应的操作,实现了对象间的一对多依赖关系。

示例二:实现消息订阅功能

下面我们以一个简单的消息订阅系统为例,详细说明 Python观察者模式实现消息订阅功能。

首先,我们需要定义两个类:主题类和观察者类。主题类包含一个观察者列表和通知观察者的方法,观察者类包含需要执行的方法。,NewsSubject类为新闻主题类,包含observers字典和register_observer、remove_observer、notify_observers、set_news等方法。其中,observers字典的键为订阅主题,值为观察者列表。NewsObserver类为观察者类,包含name属性和update方法。

接下来,我们可以创建主题对象和观察者对象,并将观察者对象注册到主题对象中。创建了一个主题对象subject和三个观察者对象observer_1、observer_2和observer_3,并将观察者对象注册到主题对象中,每个观察者订阅不同的新闻主题。

现在,我们可以发布新闻消息,然后通知订阅相应主题的观察者。具体代码如下:

# *********************************观察者模式实现消息订阅功能

# 新闻主题类
class NewsSubject():
    def __init__(self):
        self.observers = {} # 字典
        self.news = None

    def register_observer(self, observer, topic):
        if topic not in self.observers:
            self.observers[topic] = []
        self.observers[topic].append(observer)

    def remove_observer(self, observer, topic):
        if topic in self.observers:
            self.observers[topic].remove(observer)

    def notify_observers(self,topic):
        if topic in self.observers: # if语句,存在观察者订阅的主题新闻,通知观察者
            for observer in self.observers[topic]:
                observer.update(self.news)  # 通知观察者新闻

    def set_news(self, news, topic):
        self.news = news
        self.notify_observers(topic)



class NewsObserver():
    def __init__(self, name):
        self.name = name

    def update(self, news):
        print(f"{self.name}收到新闻:{news}")

subject = NewsSubject()

observer_1 = NewsObserver("name1")
observer_2 = NewsObserver("name2")
observer_3 = NewsObserver("name3")

subject.register_observer(observer_1, "国内新闻")
subject.register_observer(observer_2, "国外新闻")
subject.register_observer(observer_3, "娱乐新闻")

subject.set_news("中国的新闻,中国......", "国内新闻")
subject.set_news("外国的新闻,美国......", "国外新闻")
subject.set_news("明星...","娱乐新闻")
subject.set_news("歌星...","娱乐新闻")

运行结果:

name1收到新闻:中国的新闻,中国......
name2收到新闻:外国的新闻,美国......
name3收到新闻:明星...
name3收到新闻:歌星...

在上述代码中,我们发布了三条新闻消息,并使用set_news方法通知订阅相应主题的观察者。观察者会收到通知并执行相应的操作,例如打印收到通知的信息。

这就是 Python观察者模式实现消息订阅功能的方法。当主题状态发生变化时,通知所有订阅该主题的观察者,执行相应的操作,实现了消息订阅功能。

示例三:实现日志记录器功能

下面我们以一个简单的日志记录器系统为例,详细说明 Python观察者模式实现日志记录器功能。

首先,我们需要定义两个类:主题类和观察者类。主题类包含一个观察者列表和通知观察者的方法,观察者类包含需要执行的方法。LoggerSubject类为日志主题类,包含observers字典和register_observer、remove_observer、notify_observers等方法。其中,observers字典的键为日志级别,值为观察者列表。FileLoggerObserver类为观察者类,包含log_file属性和update方法。在update方法中,我们将收到的日志消息写入指定的日志文件中。

接下来,我们可以创建主题对象和观察者对象,并将观察者对象注册到主题对象中。创建了一个主题对象subject和三个观察者对象observer_1、observer_2和observer_3,并将观察者对象注册到主题对象中,每个观察者订阅不同的日志级别。

现在,我们可以记录日志消息,然后通知订阅相应级别的观察者。具体代码如下:

# *********************************观察者模式实现日志记录功能

# 日志主题类
class LoggerSubject():
    def __init__(self):
        self.observers = {} # 字典: 日志级别

    def register_observer(self, observer, level):
        if level not in self.observers:
            self.observers[level] = []
        self.observers[level].append(observer)

    def remove_observer(self, observer, level):
        if level in self.observers:
            self.observers[level].remove(observer)

    def notify_observers(self,message,level):
        if level in self.observers: # if语句,存在观察者订阅的主题新闻,通知观察者
            for observer in self.observers[level]:
                observer.update(message)  # 通知观察者新闻

# 观察者类
class FileLoggerObserver():
    def __init__(self, log_file):
        self.log_file = log_file

    def update(self, message):
        print(f"{self.log_file}写入日志:{message}")
        with open(self.log_file, "a") as f:
            f.write(message + "\n")

subject = LoggerSubject()

observer_1 = FileLoggerObserver("log_debug.txt")
observer_2 = FileLoggerObserver("log_info.txt")
observer_3 = FileLoggerObserver("log_error.txt")

subject.register_observer(observer_1,"debug")
subject.register_observer(observer_2, "info")
subject.register_observer(observer_3, "error")

subject.notify_observers("调试信息","debug")
subject.notify_observers("普通信息","info")
subject.notify_observers("错误信息","error")
subject.notify_observers("错误信息1","error")

运行结果:

log_debug.txt写入日志:调试信息
log_info.txt写入日志:普通信息
log_error.txt写入日志:错误信息
log_error.txt写入日志:错误信息1

在上述代码中,我们记录了三条日志消息,并使用notify_observers方法通知订阅相应级别的观察者。观察者会收到通知并将收到的消息写入指定的日志文件中。

这就是 Python观察者模式实现日志记录器功能的方法。当主题状态发生变化时,通知所有订阅该主题的观察者,执行相应的操作,实现了日志记录器功能。文章来源地址https://www.toymoban.com/news/detail-610806.html

到了这里,关于Python观察者模式介绍、使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++ 观察者模式 思想理解】C++中的观察者模式:松耦合设计与动态交互的艺术,合理使用智能指针观察者

    在进入技术细节之前,理解观察者模式(Observer Pattern)的基本概念和它在现代编程中的重要性是至关重要的。 观察者模式是一种设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。在C++中,这个

    2024年01月24日
    浏览(56)
  • 【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有一个天气预报项目,需求如下: 气象站可以将每天测量到的温度、湿度、气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压、湿度的接口 测量数据更新时,要能实时的通知给第三

    2024年02月14日
    浏览(38)
  • 观察者模式(上):详解各种应用场景下观察者模式的不同实现方式

            从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“ 类或对象之间的交互 ”问题。 原理及应用场景剖析 在对象之间

    2024年02月16日
    浏览(57)
  • 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    观察者模式(Observer Pattern)是一种行为型模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject对象带有绑定观察者到Client对象和从Client对象解绑观察

    2023年04月21日
    浏览(81)
  • 行为型模式 | 观察者模式

    观察者模式又叫做发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系 。让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 软件系统常常要求在某一个对象的状态发生变化的时候

    2024年01月22日
    浏览(78)
  • 【设计模式】观察者模式

    观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 Subject:抽象主题(被观察者

    2024年02月13日
    浏览(52)
  • 设计模式——观察者模式

    观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸,报社就是被观察者,订阅者就是观察者,订阅者通过订阅报纸与报社建立联系,而报

    2024年02月15日
    浏览(53)
  • 设计模式-观察者模式

    观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者

    2024年02月15日
    浏览(58)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(65)
  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包