菜鸟教程中关于观察者模式的介绍如下:

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

应用实例: 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

以下演示如何在实际的Spring工程中使用观察者模式。

这个demo的框架如下所示,与直接实现的观察者、被观察者模式相比,可以通过中间的观察者订阅管理服务Bean,动态注册、移除观察者,被观察者状态发生变化时,会通知观察者订阅管理服务,这个服务再通知所有订阅了这个被观察者的服务。

被观察者需要继承Java自带的util包中的Observerble接口,并且调用setChange()和notifyObservers()函数通知被观察者(在这里是观察者订阅管理服务);观察者服务,需要实现Java Util包中的Observer类接口。

首先被观察者,在需要通知观察者的时候,需要调用setChange()和notifyObservers()函数通知被观察者,其中notifyObservers函数可以传参数。

init函数在Bean初始化后,将观察者订阅管理服务添加到观察者中。

然后是观察者订阅管理服务,提供观察者注册、移除功能,在观察者状态变化时,通知所有订阅了的观察者。

然后是观察者,我在观察者Bean创建成功后就在观察者订阅管理服务注册了,也可以在其他有需要的时候拿到这个bean,订阅或者移除。观察者可以拿到被观察者在notifyObservers函数传过来的参数。

重要的事情

被观察者状态发生变化后,通知到订阅管理服务,订阅管理服务再依次通知所有观察者,这个过程是阻塞的,有可能订阅的观察者非常多,或者观察者需要做一些耗时的操作,会阻塞很长的时间,所以在观察者中要采用异步的方法来避免长时间的阻塞。

java观察者模式在spring中的应用_在Spring中使用观察者模式相关推荐

  1. java中mvc事务_关于项目中的事务问题_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...

    SpringMVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring MVC 分离了控制器.模型对象.分派器以及处理程序对象 ...

  2. boot spring 接口接收数据_在 Spring Boot 中使用 Dataway 配置数据查询接口

    Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具.使得使用者无需开发任何代码就配置一个满足需求的接口. 整个接口配置.测试.冒烟.发布.一站式都通过 ...

  3. java代码在jsp中怎么写_在jsp中写java代码

    该服务器上的所有的访问者的所有 jsp 页面 D.该服务器上的所有的访问者的所有 jsp 页面和 Java 程序 6.在 JSP 中调用 JavaBean 时不会用到的标记是( )...... jav ...

  4. java中readline函数_自定义BufferedReader中read和readLine方法

    BufferedReader中read和readLine方法总结 实例如下所示: package day0208; import java.io.FileReader; import java.io. ...

  5. spring使用自定义注解_用Spring组成自定义注释

    spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...

  6. spring aop不执行_使用Spring AOP重试方法执行

    spring aop不执行 我的一位博客关注者发送了一封电子邮件,要求我显示" Spring AOP的RealWorld用法"示例. 他提到,在大多数示例中,都演示了Spring ...

  7. spring 多个数据库_在Spring使用多个数据库

    spring 多个数据库 在开发企业应用程序时,我们经常面临访问多个数据库的挑战. 也许我们的应用程序必须将数据归档到某个数据仓库中,或者也许它必须将数据传播到某个第三方数据库. 使用Spring可以 ...

  8. spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身

    自动分析瘦身 Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar.当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离 ...

  9. python删除字符串中重复字符_从Python中删除字符串标点符号的最佳方法

    似乎有一个比以下更简单的方法: 1 2 3import string s ="string. With. Punctuation?" # Sample string out = s ...

  10. python3中format方法_[翻译]python3中新的字符串格式化方法-----f-string

    从python3.6开始,引入了新的字符串格式化方式,f-字符串. 这使得格式化字符串变得可读性更高,更简洁,更不容易出现错误而且速度也更快. 在本文后面,会详细介绍f-字符串的用法. 在此之前,让我 ...

最新文章

  1. 【BZOJ】3456: 城市规划 动态规划+多项式求逆
  2. 我的世界java有三叉戟杀手吗_我的世界-三叉戟竟能这么用 这样得怪物头颅长见识了!...
  3. NYOJ 741 数学家ST
  4. pptx和ppt计算机二级,计算机二级Ms office考试PPT考点总结.pptx
  5. android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点
  6. 算法高级(36)-如何利用并行提高算法的执行效率?
  7. const和readonly区别
  8. Java实现:归并排序
  9. STL算法之 copy、copy_backward、copy_n
  10. 康托尔连续统假设正确吗?
  11. 字节跳动否认完成支付牌照收购 或是基于央行批准的不确定性
  12. 拉新、复购、供应链,双11中小商家“三难”如何破?
  13. 红警2你值得拥有(游戏人生)
  14. iphone win7无法识别_电脑无法识别iphone、ipad的解决办法
  15. jquery传输文件到后端,后端处理数据。
  16. [RK3568 Android11] 教程之硬件中断(实验一)
  17. 第12周 立方累加和
  18. 找规律:墨菲定律、欧姆定律、帕金森定律、马太效应
  19. [论文翻译]A Global Geometric Framework for Nonlinear Dimensionality Reduction
  20. SoC和MCU的区别

热门文章

  1. LeetCode刷题——字符串转换整数
  2. 服务器云平台 系统,服务器云平台 系统
  3. rabbitmq php 自动断开,解决RabbitMQ服务启动自动关闭,访问不了问题
  4. yii2通过url访问类中的方法_行为型设计模式 访问者模式
  5. 作者:肖戎(1974-),女,广东省地方税务局高级工程师、副处长。
  6. 作者:王腾蛟(1973-),男,北京大学信息科学技术学院教授、博士生导师,北京大学文理大数据研究中心常务副主任。...
  7. 作者:张峰(1978-),男,博士,国家海洋信息中心副研究员
  8. 获奖者:武永卫,男,清华大学计算机系教授、博士生导师,《大数据》杂志编委。...
  9. 【面向对象】面向对象程序设计测试题10-类的设计测试题
  10. 12.1 LNMP架构介绍 12.2 MySQL安装 12.3/12.4 PHP安装 12.5 Nginx介绍