观察者设计模式
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就是事件的接口.事件有非常多,都可以实现这个接口,那么这个事件就有自己的东西.
-
与应用程序上下文相关联
所有这种类型的事件都继承自org.springframework.context.event.ApplicationContextEvent类。它们应用于由org.springframework.context.ApplicationContext引发的事件(其构造函数传入的是
ApplicationContext
类型的参数)。这样,我们就可以直接通过应用程序上下文的生命周期来得到所发生的事件:ContextStartedEvent
在上下文启动时被启动,当它停止时启动ContextStoppedEvent
,当上下文被刷新时产生ContextRefreshedEvent
,最后在上下文关闭时产生ContextClosedEvent
-
与request 请求相关联
由org.springframework.web.context.support.RequestHandledEvent实例来表示,当在ApplicationContext中处理请求时,它们被引发。
Spring如何将事件分配给专门的监听器?
这个过程由事件广播器来实现,由org.springframework.context.event.ApplicationEventMulticaster接口的实现表示。此接口定义了3种方法
- addApplicationListener() 添加新的监听器**:定义了两种方法来添加新的监听器:addApplicationListener(ApplicationListener<?> listener)和addApplicationListenerBean(String listenerBeanName)。当监听器对象已知时,可以应用第一个。如果使用第二个,我们需要将bean name 得到listener对象(
依赖查找DL
),然后再将其添加到listener
列表中 - removeApplicationListenerBean(String listenerBeanName) 删除监听器:添加方法一样,我们可以通过传递对象来删除一个监听器(**removeApplicationListener(ApplicationListener<?> listener)**或通过传递bean名称。第三种方法,**removeAllListeners()**用来删除所有已注册的监听器
- **multicastEvent(ApplicationEvent event)**将事件发送到已注册的监听器
在JDK当中也封装了事件,但是用到了swing的编程中去了.也就是java中的事件:EventListener,只不过这个接口是用到了swing编程中去了.
EventObject也就是Java当中的事件.