JDK的事件发布监听机制

什么是事件监听机制?

在讲解事件监听机制前,我们先回顾下设计模式中的观察者模式,因为事件监听机制可以说是在观察者模式基础上的进一步抽象和改进。我们可以在JDK或者开源框架中比如spring,dubbo中看到它的身影,从这个意义上说事件监听机制可以看做一种传统观察者模式的具体实现,不同框架对其实现方式会有些差别。

JDK的事件发布监听机制

典型的观察者模式将有依赖关系的对象抽象为观察者和主题两个不同的角色,多个观察者同时观察一个主题,两者通过抽象接口保持松耦合状态,这样双方可以相对独立的进行扩展和变化。比如可以很方便的增删观察者,修改观察者中的更新逻辑而不用修改主题中的代码。但是这种解耦进行的不彻底,具体体现在以下几个方面。

  1. 抽象主题需要依赖抽象观察者,而这种依赖关系完全可以去除。
  2. 主题需要维护观察者列表,并对外提供动态增删观察者的接口。
  3. 主题状态改变时需要由自己去通知观察者进行更新。

我们可以把主题(subject)替换成事件(event),把对特定主题进行观察的观察者(observer)替换成对特定事件进行监听的监听器(EventLister),而把原有主题中负责维护主题与观察者映射关系以及在自身状态改变时通知观察者的职责从中抽出,放入一个新的角色事件发布器(EventPublisher)中,事件监听模式的轮廓就展现在我们面前。

常见事件监听机制的主要角色如下:

  1. 事件及事件源:对应于观察者模式中的主题。事件源发生某事件是特定事件监听器被触发的原因。
  2. 事件监听器:对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应逻辑。
  3. 事件发布器:事件监听器的容器,对外提供发布事件和增删事件监听器的接口,维护事件和事件监听器之间的映射关系,并在事件发生时负责通知相关监听器。
JDK的事件发布监听机制

JDK中对事件监听机制的支持

JDK为用户实现自定义事件监听提供了两个基础的类。一个是代表所有可被监听事件的事件基类java.util.EventObject,所有自定义事件类型都必须继承该类。

该类内部有一个Object类型的source变量,逻辑上表示该事件的事件源,实际上可以用来存储包含该事件的一些相关信息。

另一个则是对所有事件监听器进行抽象的接口java.util.EventListener。这是一个标记接口,内部没有任何抽象方法。所有自定义事件监听器都必须实现该标记接口。

以上就是JDK为我们实现自定义事件监听提供的底层支持。针对具体业务场景,我们通过扩展java.util.EventObject来自定义事件类型,同时通过扩展java.util.EventListener来定义在特定事件发生时被触发的事件监听器。当然不要忘了还要定义一个事件发布器来管理事件监听器并提供发布事件的功能。

基于JDK要实现对自定义事件的监听还是比较麻烦的,要做的工作比较多。而且自定义的事件发布器也不能提供对所有事件的统一发布支持。


分享到:


相關文章: