观察者设计模式

jie神说用订阅和发布来理解更好,我想了一下是的
为什么呢?因为监听器这个名词听起来是一个主动的,可实际监听器是一个被动的玩意
比如我们事件源发布一个事件,然后监听器订阅了这个事件就能做出动作。
里面涉及到三个对象,事件源,事件、监听器,大家好好理解一下

特点:

  • 持有监听的观察者的引用
  • 支持增加和删除观察者
  • 主题状态改变,通知观察者

观察者implements Observer 重写update方法:

  • 当被观察者发生变化,收到通知进行具体的处理
  • 可以随时取消

优点松耦合:

  • 观察者增加或删除无需修改被观察者的代码,只需调用被观察者对应的增加或者删除的方法即可
  • 被观察者只是负责通知观察者,但无需了解观察者如何处理通知
  • 观察者只需等待被观察者通知,无需观察被观察者相关的细节

有点通知不错过:

  • 由于被动接受,正常情况下不会发生错过主题的改变通知.而主动获取的话,由于时机选取问题,可能导致错过某些状态.

Java实现:

java中有观察者模式使用的API

  • java.util.Observable这是一个类 继承,这是被观察者.
  • java.util.Observer这是一个接口 实现,这是观察者,也是监听器

开关的重要性:

  • 可以筛选通知
  • 可以撤销通知
  • 可以控制通知

Spring中的Events

事件通过org.springframework.context.ApplicationEvent实例来表示。这个抽象类继承扩展了java.util.EventObject,可以使用EventObject中的getSource方法,我们可以很容易地获得所发生的给定事件的对象。这里,事件存在两种类型,其实EventObject就是事件的接口.事件有非常多,都可以实现这个接口,那么这个事件就有自己的东西.

  1. 与应用程序上下文相关联

    所有这种类型的事件都继承自org.springframework.context.event.ApplicationContextEvent类。它们应用于由org.springframework.context.ApplicationContext引发的事件(其构造函数传入的是ApplicationContext类型的参数)。这样,我们就可以直接通过应用程序上下文的生命周期来得到所发生的事件:ContextStartedEvent在上下文启动时被启动,当它停止时启动ContextStoppedEvent,当上下文被刷新时产生ContextRefreshedEvent,最后在上下文关闭时产生ContextClosedEvent

  2. 与request 请求相关联

    org.springframework.web.context.support.RequestHandledEvent实例来表示,当在ApplicationContext中处理请求时,它们被引发。

    Spring如何将事件分配给专门的监听器?

这个过程由事件广播器来实现,由org.springframework.context.event.ApplicationEventMulticaster接口的实现表示。此接口定义了3种方法

  1. addApplicationListener() 添加新的监听器**:定义了两种方法来添加新的监听器:addApplicationListener(ApplicationListener<?> listener)和addApplicationListenerBean(String listenerBeanName)。当监听器对象已知时,可以应用第一个。如果使用第二个,我们需要将bean name 得到listener对象(依赖查找DL),然后再将其添加到listener列表中
  2. removeApplicationListenerBean(String listenerBeanName) 删除监听器:添加方法一样,我们可以通过传递对象来删除一个监听器(**removeApplicationListener(ApplicationListener<?> listener)**或通过传递bean名称。第三种方法,**removeAllListeners()**用来删除所有已注册的监听器
  3. **multicastEvent(ApplicationEvent event)**将事件发送到已注册的监听器

在JDK当中也封装了事件,但是用到了swing的编程中去了.也就是java中的事件:EventListener,只不过这个接口是用到了swing编程中去了.
EventObject也就是Java当中的事件.

springBoot 观察者模式相关推荐

  1. springboot实现设计模式- 观察者模式

    观察者模式可用于订阅发布类似场景之类使用 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. ...

  2. 观察者模式的Java实现及应用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Turwe www.jianshu.com/p/1025f6 ...

  3. 三种方式实现观察者模式 及 Spring中的事件编程模型

    观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...

  4. springboot启动流程

    一句话总结:在context的refresh方法中,需要注册bean definition,实例化bean.在加载bean defintion的时候使用ConfigurationClassParser ...

  5. 设计模式:观察者模式(有利于代码解耦)

    什么是ApplicationContext?  它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些.  ApplicationContext则是应用的容器. Spr ...

  6. SpringBoot启动如何加载application.yml配置文件

    一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...

  7. SpringBoot启动流程是怎样的

    前言 SpringBoot一开始最让我印象深刻的就是通过一个启动类就能启动应用.在SpringBoot以前,启动应用虽然也不麻烦,但是还是有点繁琐,要打包成war包,又要配置tomcat,tomcat ...

  8. SpringBoot 使用注解实现消息广播功能

    背景 在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,那就是事件监听,事件监听也 ...

  9. Guava、Spring 如何抽象观察者模式?

    什么是观察者模式 观察者模式 是一种行为设计模式,允许定义一种订阅通知机制,可以在对象(被观察者)事件发生时通知多个 "观察" 该对象的观察者对象,所以也被称为 发布订阅模式 其实 ...

最新文章

  1. 最终一致性,一致只会迟到,但绝不会缺席
  2. mysql数据库存储引擎选择_MySQL数据库性能优化之存储引擎选择
  3. 第三方免费加固横向对比
  4. 多线程爬取新闻标题和链接
  5. 新松机器人发行价_知识创造财富,“机器人第一股”背后的院士是怎样炼成的?...
  6. visual studio installer 卸载时不能删除安装目录问题
  7. 传智播客Java 方法
  8. ubuntu21.04美化使用
  9. 计算机辅助设计技术基础教程,《计算机辅助设计技术基础》课程教案.doc
  10. python数据库模糊查询_python中的mysql数据库like模糊查询
  11. Wilcoxon秩和检验
  12. Compiler Optimization on VLIW Instruction Scheduling for Low Power
  13. python将时间戳转换成北京时间、标准格式
  14. bcm5396交换机级联配置_「收藏」Cisco交换机安全配置设定
  15. 远程控制台调用java_JAVA实现远程控制(JAVA in RemoteControl)
  16. 多客技巧分享|【建议收藏】TikTok七大避坑指南帮你少走许多弯路
  17. css中图片缩小代码,css让图片等比例缩小的代码
  18. 2018年高德地图POI全国数据下载
  19. Dialog的Dismiss方法使用注意事项
  20. 嵌入式计算机分类,嵌入式系统的分类

热门文章

  1. JavaScript入门记录
  2. [名称]像素时钟频率、像素时钟周期
  3. uniapp 动态控制顶部导航栏显隐,控制右上角按钮隐藏 app
  4. 硬件笔记(1)---- 以太网控制器类型
  5. 微信公众平台深度开发JAVA版第一季 22.微信猜数字活动4
  6. 马斯克卸任推特CEO?谁赞成谁反对!
  7. ajax使用教程——ajax使用方法及相关知识点详细解析
  8. aspmaker和mysql_五分钟制作ASP图书管理系统 ASPMaker简单教程
  9. Sinfor AC Logs Query
  10. 数据结构与算法--动态规划资源