首页
学习
活动
专区
工具
TVP
发布

Python 设计模式—观察者模式

这是无量测试之道的第191篇原创 分享主题:Python 设计模式之观察者模式 定义 观察者模式也叫发布订阅模式,定义了对象之间一对多依赖,当一个对象改变状态时,这个对象的所有依赖者都会收到通知并按照自己的方式进行更新...观察者设计模式是最简单的行为模式之一。在观察者设计模式中,对象(主题)维护了一个依赖(观察者)列表,以便主题可以使用观察者定义的任何方法通知所有观察者它所发生的变化。...使用场景 在广播或者发布订阅系统的情形中,你会看到观察者设计模式的用法,它的主要使用场景如下: 在分布式系统中实现事件服务。 用作新闻机器的框架。 股票市场也是观察者模式的一个大型场景。...代码实现 1、创建观察者类 class Watcher: #初始化具体的成员 def __init__(self,id,name): self.id=id

24010

Python 设计模式:观察者模式

事件扮演发布者的角色,监听者则扮演观察者的角色。 Python 实现 现在,让我们回到文章开始的那个问题。 这里我们可以实现一个基类 Publisher,包括添加、删除及通知观察者这些公用功能。...__init__() 做的第一件事就是调用基类的__init__() 方法,因为这在 Python 中没法自动完成。DefaultFormatter 实例有自己的名字,这样便于我们跟踪其状态。...'__main__': main() 完整代码参考:https://gist.github.com/gusibi/93a000c79f3d943dd58dcd39c4b547f1 运行代码: python...总结 这一篇我们介绍了观察者模式的原理以及 Python 代码的实现。...参考链接 The 10 Minute Guide to the Observer Pattern in Python:http://www.giantflyingsaucer.com/blog/?

64720
您找到你想要的搜索结果了吗?
是的
没有找到

观察者模式

观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 从根本上说,该模式必须包含两个角色:观察者和被观察对象。...观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。...被观察对象(Subject)发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。...使用观察者模式A可以作为被观察者(Subject),B、C、D可以作为观察者(Observer)。...我们需要实现一个观察者的时候只需要实现这个接口就OK了。 java.util.Observable是一个类,被观察者类,我们需要实现一个被观察者的时候只需要继承这个类就OK了。

66320

观察者模式

根据多个观察者对于同一主题信息的获取方式,可以分为: 被观察者(主题)主动推送,一变化,就将被观察对象推送给所有观察者观察者通过接口主动拉取主题中的部分信息,避免无关信息的干扰。...首先,我们需要定义观察者和被观察者接口,并定义通知能力接口。...: 观察者可以随时进行注册和注销行为 被观察者只会给注册过的观察者发送通知 不同代理商接收通知的顺序和自己注册的先后有关系 那么思考下这个模式有没有什么不好的地方?...每次被观察者发送消息,观察者都需要全部接收并处理。如果信息比较复杂或是观察者只关注其中一部分数据怎么处理? 这种属于被动等待被观察者推的行为,如果不是通知,而是其他一些实时数据的监控呢?...如果观察者不想等待,想直接获取当前实时数据信息呢? JDK内置了观察者模式的实现,为什么还要自己定义呢?与自定义的有什么区别呢? 带着问题,我们来看下JDK内置的观察者模式怎么实现的?

47720

观察者模式

订阅者模式通常也成为发布-订阅模式,发布者也称为通知者,订阅者也称为观察者。通知者发出通知,各发布者则收到通知后做出相应的动作。由于存在不同的订阅者和通知者,所以将这两者抽象出来。...image.png 其实Subject和Observer是抽象类还是接口,这个是比较灵活的,取决于你的应用场景是怎样,总之就是要将它们抽象出来,方便不同的通知者和观察者来实现它们。...在《大话设计模式》中提到了,如果观察者是几个风马牛不相及的呢?我们现在是抽象成一个公共类,如果两个观察者无法抽象成一个公共类怎么办呢?...《大话设计模式》中提到了利用“事件委托”来实现,由于此书是C#,但在Java中好像并没有线程的事件委托实现,在下一篇中会写利用“事件委托”来实现观察者模式,同样Java自带了Observer接口以提供对观察者模式的支持...,下一篇我们也会利用JDK来实现观察者模式。

67070

观察者模式

观察者模式需要如下几个对象构建出整个框架: 1抽象主题角色:提供了一个用于保存观察者对象的聚集类和增加删除观察者对象的方法,以及通知所有观察者的抽象方法 2具体主题:具体目标类,实现抽象主题的类...3抽象观察者:是一个抽象类接口,包含一个更新自己的抽象方法,更改通知时随时被调用 4具体观察者 具体例子 import java.util.ArrayList; import java.util.Iterator..."; peopleDaily.notifyObserver(); } } // 抽象主题 abstract class WeChatSubscribe { // 定义观察者集合...AbstractOB> observers = new ArrayList(); public String sendMessage = ""; // 添加观察者方法...public void add(AbstractOB observer) { observers.add(observer); } // 移出观察者方法

34120

观察者模式实现日志实时监测?Python实例详解

观察者模式也叫发布-订阅模式,定义了对象之间一对多依赖,当一个对象改变状态时,这个对象的所有依赖者都会收到通知并按照自己的方式进行更新。 观察者设计模式是最简单的行为模式之一。...在观察者设计模式中,对象维护了一个依赖(观察者)列表,以便主题可以使用观察者定义的任何方法通知所有观察者它所发生的变化。...可使用观察者模式应用场景 在广播或者发布订阅系统的情形中,你会看到观察者设计模式的用法,它的主要使用场景如下: 1、分布式系统中实现事件服务。 2、广播或发布/阅系统情形中。...观察者模式类图 ←观察者模式类图→ 1、发布者Publisher:向其他对象发送值得关注的事件。事件会在发布者自身状态改变或执行特定行为后发生。...观察者模式示例 假如我们对应用函数运行状态进行监测,当发生异常时报警记录,可通过观察者模式进行信息订阅:1、短信 2、日志 3、邮件 代码实现---subscription_model.py 1、创建订阅者类

29830

观察者模式

1.定义 观察者模式是一种行为类模式,它定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。...2.实例(订阅杂志) /** * 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己 */ public interface Observer { /** * 有更新就推送消息...*/ public void update(String message); } /** * 具体的观察者类,也就是订阅者 */ public class User implements...requestLayout();//************************重新布局,ViewGroup } } 4.总结 1.优点 (1)观察者和被观察者之间是抽象耦合...2.缺点 在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率

55030

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。...2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。 优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。...缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。...注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。...实现 观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。

31710

观察者模式

观察者模式的核心是将观察者与被观察者解耦,以类似消息/广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应。...通用代码实现 观察者进行抽象: //抽象观察者 public interface Observer { //反应 void response(); } 两个观察者: //观察者1 public...该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。 具体主题(ConcreteSubject):具体被观察者,当其内部状态变化时,会通知已注册的观察者。...观察模式扩展 优缺点 优点 观察者和被观察者是松耦合(抽象耦合)的,符合依赖倒置原则。...事件通知呈线性关系,如果其中一个观察者处理事件卡壳,则会影响后续的观察者接收该事件。 如果观察者和被观察者之间存在循环依赖,则可能造成两者之间的循环调用,导致系统崩溃。

63120

观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。...,通过attach和detach方法维护一个观察者的集合,当自己维护的状态(state)改变时通知(notify)所有观察者 抽象观察者(Observer):定义更新自己的方法 具体观察者(ConcreteObserver...首先,前台妹妹是具体主题角色,员工是具体观察者角色。其次,前台妹妹维护着观察者集合,在老板回来了这个状态上通知所有观察者观察者在前台妹妹通知之后执行自己的更新方法,该干嘛干嘛。...符合开闭原则,继承抽象主题添加被观察者,继承抽象观察者添加观察者。 缺点 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。...观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。 总结 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

38710

观察者模式

观察者模式 观察者模式Observer Pattern是一种对象行为型模式,当定义的对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新,观察者模式又叫做发布...所以发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。...优点 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。...观察者模式在观察目标和观察者之间建立一个抽象的耦合。 观察者模式支持广播通信。 观察者模式符合开闭原则的要求。...缺点 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

41800

观察者模式

概述   有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。...观察者就是解决这类的耦合关系的。 ---- 观察者模式 观察者模式适合解决多种对象跟踪一个对象数据变化的程序结构问题, 有一个称作“主题”的对象和若干个称作“观察者的对象”。...因此设计观察者模式的只有两种角色:主题和观察者观察者模式中我们可以从以下递推中得出一些重要的结论 主题要知道有哪些观察者对其进行监测,因此主题类中一定有一个集合类成员变量,包含了观察这的对象集合。...既然包含了观察者对象的集合,那么观察者一定是多态的,有共同的父类接口 主题完成的主要功能是:可以添加观察者,可以撤销观察者,可以向观察者发消息,引起观察者相应。...---- JDK中的观察者和设计者模式 由于观察者模式中主题类功能以及观察者接口定义内容的稳定性,JDK的java.utils包提供了系统的主题类Observable以及观察者接口Observer.

63740

观察者模式

观察者模式(有时又被称为发布(publish-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。...在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。...观察者模式中包含以下几种对象类型: 观察者(Observer):观察者将自己注册到被观察对象中,被观察对象将观察者存放在一个容器(Container)里。...被观察对象(Subject):被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。...示例 # coding:utf-8 import weakref class Subject(object): """被观察对象,使用列表存储所有观察者""" def __init__

26420

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券