首页 > 编程语言 >Python设计模式-11-观察者模式

Python设计模式-11-观察者模式

时间:2023-06-16 18:44:36浏览次数:40  
标签:11 observer Python self 观察者 state 设计模式 def subject

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它会自动通知所有观察者对象,使它们能够及时更新自己的状态。观察者模式通常包括以下几个角色:

  • 主题(Subject):定义了被观察的对象,可以有多个观察者监听它。

  • 观察者(Observer):定义了接收主题通知的接口,每个观察者都可以根据主题的通知来更新自己的状态。

  • 具体主题(Concrete Subject):实现了主题接口,可以添加、删除和通知观察者。

  • 具体观察者(Concrete Observer):实现了观察者接口,可以接收主题的通知并更新自己的状态。

下面是一个简单的 Python 示例,演示了如何使用观察者模式:

class Subject:
    def __init__(self):
        self.observers = []

    def attach(self, observer):
        self.observers.append(observer)

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

    def notify(self):
        for observer in self.observers:
            observer.update(self)

class ConcreteSubject(Subject):
    def __init__(self):
        super().__init__()
        self.state = None

    def get_state(self):
        return self.state

    def set_state(self, state):
        self.state = state
        self.notify()

class Observer:
    def update(self, subject):
        pass

class ConcreteObserverA(Observer):
    def update(self, subject):
        print(f'ConcreteObserverA: Subject state is {subject.get_state()}.')

class ConcreteObserverB(Observer):
    def update(self, subject):
        print(f'ConcreteObserverB: Subject state is {subject.get_state()}.')

subject = ConcreteSubject()

observer_a = ConcreteObserverA()
subject.attach(observer_a)

observer_b = ConcreteObserverB()
subject.attach(observer_b)

subject.set_state('state1')
subject.set_state('state2')

subject.detach(observer_a)

subject.set_state('state3')

在上面的示例中,我们定义了一个主题 Subject,它定义了被观察的对象,并可以添加、删除和通知观察者。然后,我们定义了一个具体主题 ConcreteSubject,它实现了主题接口,并包含一个状态。在 set_state() 方法中,我们首先更新状态,然后调用 notify() 方法通知所有观察者。接下来,我们定义了一个观察者 Observer,它定义了接收主题通知的接口。然后,我们定义了两个具体观察者 ConcreteObserverA 和 ConcreteObserverB,它们实现了观察者接口,并可以接收主题的通知并更新自己的状态。

在使用观察者模式时,我们可以通过创建一个主题和多个观察者来实现一对多的依赖关系。在上面的示例中,我们创建了一个具体主题 ConcreteSubject 和两个具体观察者 ConcreteObserverA 和 ConcreteObserverB,并将它们组合在一起。当主题的状态发生变化时,它会自动通知所有观察者,并让它们能够及时更新自己的状态。需要注意的是,观察者模式可以帮助我们实现一对多的依赖关系,但也可能会导致系统的复杂性增加。

标签:11,observer,Python,self,观察者,state,设计模式,def,subject
From: https://www.cnblogs.com/superhin/p/17486304.html

相关文章

  • 【Python入门教程】调取电脑摄像头并发送照片至邮箱
    ​        本博文纯属娱乐,仅供大家学习参考,不得以此侵犯他人隐私。本篇文章参考Python研究者的python窃取摄像头的图片。在这里先感谢大佬的付出,大家可以去关注一下。一、获取邮箱授权码        授权码用于调用邮箱实现邮件的发送,这里以QQ邮箱做演示,在设置的账......
  • 设计模式中一对多的观察者模式
    highlight:a11y-darktheme:smartblue最近在学习当中学到了一段话:在学一样东西的时候,可以按照它是什么,有什么用,优点是什么,缺点是什么,要怎么去使用,或者使用的时候要注意什么。我觉得这五部曲还是很有用的,能帮你快速掌握一个知识点观察者模式是什么?定义对象之间的一种一对多的关系......
  • Python设计模式-03-原型模式
    原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。原型模式通常包括以下几个角色:原型(Prototype):定义了一个克隆自身的接口,用于复制现有对象。具体原型(ConcretePrototype):实现了原型接口,负责复制自身。客户端(Client):使用原型接口来复......
  • Python设计模式-04-单例模式
    单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式通常包括以下几个角色:单例(Singleton):定义了一个静态方法或类方法,用于获取单例对象。客户端(Client):使用单例对象来完成具体的操作。下面是一个简单的Python示例,演示了如何使用单例模式创......
  • Python设计模式-05-适配器模式
    适配器模式是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一个接口。适配器模式通常包括以下几个角色:目标接口(Target):定义了客户端所期望的接口,可以是一个抽象类或接口。适配器(Adapter):实现了目标接口,并持有一个被适配对象的引用,负责将客户端的请求转换成被适......
  • Jenkins-Slave节点 电脑A控制电脑B运行Python脚本
    电脑A装了Jenkins的服务器,电脑B作为Jenkins的节点电脑(Slave)Jenkins服务的配置1、ManageJenkins>ConfigureSystem 找到JenkinsURL,确保不是127.0.0.1或者localhost就可以了。 2、ManageJenkins>ConfigureGlobalSecurity找到代理,设置端口或者选择随机选取,再把代......
  • Python设计模式-02-建造者模式
    建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包括以下几个角色:产品(Product):表示被构建的复杂对象,通常包含多个部分或组件。抽象建造者(Builder):定义了创建产品的抽象接口,包括创建产品的各个部......
  • python自动使用虚拟环境和安装依赖
    代码如下,Windows环境测试通过importosimportplatformimportreimportsysfrompathlibimportPathdefis_venv()->bool:"""判断是否处于虚拟环境(也适用于poetry的)"""ifhasattr(sys,"real_prefix"):returnTruer......
  • Python - 方法参数中,带self和不带self的区别
    不带self该python文件中,没有类的概念。因此所有的方法参数中,没有self#文件名solution.pydefpartition(head:Optional[ListNode],x:int)->Optional[ListNode]:#...if__name__=='__main__':#注意这里的区别...partition() 如果未来要在其他类里......
  • python中parse的action = store_true含义
     我们在python脚本中经常看到action="store_true,如下图: parser.add_argument('--image',default=False,action="store_true",help='Imagedetectionmode,willignoreallpositionalarguments') 如果运行代码时加了   --image,那么im......