在Spring中使用观察者模式

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

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

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

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

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

关键代码:在抽象类里有一个 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函数传过来的参数。

重要的事情

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

原文地址:https://www.cnblogs.com/liangf27/p/11822936.html

时间: 2024-10-28 21:01:39

在Spring中使用观察者模式的相关文章

在商城系统中使用设计模式----策略模式之在spring中使用观察者模式和发布/订阅

1.概念: 观察者模式: 是属于设计者模式中的一种,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知. 发布/订阅: 是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者),而是通过调度器将消息发布给订阅者. 2.区别:下图明显可以看出发布/订阅比观察者模式中多了一层中间信道, 在Observer模式中,O bservers知道Subject,同时Subject还保留了Observers的记录.然而,在发布者/订阅者中,发布者和订阅

spring事件驱动模型--观察者模式在spring中的应用

spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用,关于观察者模式在之前的博文中总结过,http://www.cnblogs.com/fingerboy/p/5468994.html  这里主要讲一下Spring中的观察者模式的应用. spring事件驱动模型的结构. 首先明确几个spring提供的类的概念 1.ApplicationEvent public abstract class ApplicationEvent extends EventObject { pr

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

观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧,你可以自信的告诉他,Spring中的ApplicationListener就运用了观察者模式. 让我们一步一步来,首先我们要知道到底什么是观察者模式,用Java是如何实现的,在这里,我将会用三种方式来实现观察者模式. 什么是观察者模式 在现实生活中,观察者模式处处可见,比如 看新闻,只要新闻开始播放

关于spring中的事件体系

在客户这边上班,平时做开发的时候用到了一个客户自己写的一个开发框架,和spring类似,就是功能少一点,提供了依赖注入,事件体系,任务执行等常用的功能,还提供了一个桥接器,可以把spring中的bean映射为该框架中的bean,在看该框架的代码的事件体系的时候我也顺便看了一下spring中的事件体系的实现方式,发现,spring中的事件体系实现的比较简单,和之前自己想当然的不太一样(以前自己想当然的以为spring的事件体系肯定是使用了观察者模式之类的,看了源代码之后,发现其实不是这样的) sp

用Spring提高java观察者模式灵活性

在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入?新的逻辑,加入?新的listener类后,还是须要改动Client类,那么我们能够借助spring提供的容器来帮助我们完好观察者模式. 在spring,在src下建立spring配置文件 <bean id="sessionFactory" class="org.springframework.orm.hib

Spring中ApplicationContext和beanfactory区别

BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP功能.Web应用等.   ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能.ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功

Spring中使用到的设计模式

1.工厂模式:Beanfactory和ApplicationContext 2.单例模式:bean的构建 3.代理模式:AOP 4.模板模式:jdbcTemplate,hibernateTemplate等以Template结尾的对数据库操作的类,一般情况下,是使用继承的方式来实现模板模式,但spring没有使用这种方式,而死使用Callback模式与模板方法模式配合,即达到了代码服饰的效果,同时增加了灵活性. ps: Spring中的Callback模式与Template模式合用,随处可见.Te

Spring 中的事件机制

说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作.这些listener是怎么实现的呢?说listener之前,我们先从设计模式开始讲起. 观察者模式 观察者模式一般包含以下几个对象: Subject:被观察的对象.它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify().目标类可以是接口,也可以是抽象类或具体类. ConcreteSubject:具体的

Spring中如何使用工厂模式实现程序解耦?

目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解耦? 既然是程序解耦,那我们必须要先知道啥是耦合,耦合简单来说就是程序的依赖关系,而依赖关系则主要包括 1. 类之间的依赖 2. 方法间的依赖 比如下面这段代码: public class A{ public int i; } public class B{ public void put(A a)