首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 设计模式—观察者模式

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

27510

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/?

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

    观察者模式

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

    70670

    观察者模式

    观察者模式需要如下几个对象构建出整个框架: 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); } // 移出观察者方法

    37720

    观察者模式

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

    69120

    观察者模式

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

    50920

    观察者模式.

    观察者模式四个角色:  1、抽象主题:定义对观察者管理的接口,包括 订阅、取消订阅、通知接口。  ...2、具体主题:把所有观察者对象的引用保存在一个聚集(比如ArrayList对象)里,实现抽象主题的接口,并在更新时通知观察者。  ...3、抽象观察者:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。  4、具体观察者:实现抽象观察者定义的接口,得到主题通知的数据(pull or push),并实现自己的逻辑。...主题 + 观察者 = 观察者模式,可以用报纸订阅服务来模拟这个模式 —— 报纸是主题,订阅报纸的人是观察者观察者可以选择是否订阅或者退订主题。...缺点:在应用观察者模式时需要考虑一下开发效率和运行效率的问题,因为在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,我们一般会采用异步实现。

    48810

    观察者模式

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

    28320

    观察者模式

    观察者模式: 观察者模式定义了一种一对多的依赖关系,当一个对象改变状态时,它的所有依赖者都会受到通知,并自动更新。...注意: 观察者模式会造成内存泄漏,一定要记得取消订阅 UML关系图如下: UML 观察者模式提供了一种对象设计,让主题和观察者之间松耦合。...观察者与主题之间依赖于接口,主题不需要知道观察者的具体实现 可以动态添加删除观察者,对主题没有任何影响 新增新类型的观察者对主题没有影响,主题的代码不需要修改,而且旧的观察者也不受影响 观察者与主题都可以独立复用...,因为是松耦合 只要约定的接口不改变,修改主题或观察者任何一方,都不会影响另一方 代码实现 首先定义抽象的观察者: public interface Watcher { void update...(Watcher watcher); void notifyWatchers(String str); } 定义具体的观察者 public class ConcreteWatcher implements

    70480

    观察者模式

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

    17820

    观察者模式

    观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象在状态上发生改变时,通知所有的观察者对象,并让他们自动更新自己; 观察者模式的组成 抽象主题角色: 将所有的观察者引用存放到一个集合中...,每个主题可以拥有任意数量的观察者;主题提供一个接口,用来增加,移除通知观察者。...一般用一个抽象类或接口来实现; 抽象观察者角色: 为所有的观察者定义一个接口,在得到主题通知时更新自己; 具体主题角色: 在具体主题状态发生改变时,通知所有登记过的观察者。...具体主题通常由一个子类实现; 具体观察者角色: 该角色实现抽象观察者角色所要求的更新接口,在得到主题通知时更新自己,让本身的状态和观察者的状态相协调。通常是一个自类实现。...程序实现 抽象观察者角色 /** * 抽象观察者接口 * Created by sky-mxc on 2016/12/25. */ public interface IObserver {

    423100

    观察者模式

    观察者模式 概述 UML类图 代码栗子 总结 概念 概念 观察者模式又叫做发布-订阅模式,观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新...栗如,抗日战争中我方地下党人会密切监视日军的一举一动,根据它们的战略部署及时做出相应的返回,这也就是观察者模式(我军->观察者;日军->被观察者) 作用 观察者和被观察者之间是抽象耦合 建立一套触发机制...image 代码栗子 观察者 注意这里的接口 Observer ,这是观察要实现的接口,JDK 原生提供了 观察者接口的定义,这里就直接使用JDK自带的 public class ClassLeader...+ reportContext); } } 被观察者 Observable 接口也是使用JDK的原生定义的 public interface IStudent { /...image.png 总结 观察者模式的应用极其广泛,但是要注意它的观察链(触发链),栗子 A观察B ,触发C; C观察D ,触发E;E观察F ,触发A; 这样一条触发链后期维护的成本很大 参考资料 书籍

    35020

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券