动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

浅谈事件驱动机制

07-30 16:15 286浏览
举报 T字号
  • 大字
  • 中字
  • 小字

事件驱动机制是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。在计算机编程、公共关系、经济活动等领域均有应用。

所谓事件驱动,简而言之就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制。事件驱驱动架构由三个基本组件构成,事件、事件处理器、事件循环。事件产生后发送给事件循环,事件循环将每个事件分派给个各个事件处理器。事件A由处理器A处理,事件B将被处理器B处理。对于框架的使用者来说,他们能够看到的是事件处理器,这也是他们能够进行操作的地方

事件驱动的一个常见形式便是发布-订阅模式。事件驱机制的耦合度相对来说很高。在跨进程的通信间,我们通常采用引入 MQ (消息队列) 来实现消息的发布和订阅。目前主流应用的架构中,均采用消息的发布-订阅模式来进行大型分布式系统的解耦。使得数据生产方和使用方分离,同时 MQ 还可起到削峰等作用。同一进程内很多时候也需要这种事件驱动机制来进行逻辑解耦。使用事件机制

事件机制主要由三个部分组成:事件源,事件对象,监听器,具体描述如下: - 事件源:事件发生的起源 - 事件对象:事件实体,事件对象会持有一个事件源 - 监听器:监听事件对象,对事件对象进行处理

Java 提供了事件相关的接口定义,具体包含以下两个:

  1. EventObject: 事件对象,自定义事件对象需要继承该类
  2. EventListener: 事件监听器接口

由于事件源 Source 不需要实现任何接口,所以 Java 中没给出相应的定义。 一个简单的利用 Java 原生实现事件模型的例子:

public class EventTest {

    public static void main(String[] args) {

        EventSource eventSource = new EventSource();

        TestEventListener listener = new TestEventListener();

        eventSource.addListener(listener);

        eventSource.publishEvent(new TestEvent(eventSource, "一个事件"));

    }

}

 

/**

 * 事件对象

 */

class TestEvent extends EventObject {

 

    private String msg;

 

    /**

     * Constructs a prototypical Event.

     *

     * @param source The object on which the Event initially occurred.

     * @param msg 附加消息

     * @throws IllegalArgumentException if source is null.

     */

    public TestEvent(Object source, String msg) {

        super(source);

        this.msg = msg;

    }

 

    public String getMsg() {

        return msg;

    }

}

 

/**

 * 事件监听者,按照 Java 规范应实现 EventListener 接口

 */

class TestEventListener implements EventListener {

    public void handleEvent (TestEvent event) {

        System.out.println("TestEvent, msg is:" + event.getMsg());

    }

}

 

/**

 * 事件源

 */

class EventSource {

    private Set listenerSet = new HashSet<>();

 

    public void addListener(EventListener listener) {

        listenerSet.add(listener);

    }

 

    public void publishEvent(TestEvent event) {

        for (EventListener eventListener : listenerSet) {

            ((TestEventListener) eventListener).handleEvent(event);

        }

    }

}

以上代码示例便是在 Java 中实现一个事件的发布与监听的过程。

 Spring 框架使用事件与在 Java 中使用时间机制其实并没有什么不同,均由 事件源、事件对象以及事件监听者组成。与 Java 原生提供的事件机制不同的是,Spring 中提供了 ApplicationEvent 类作为基类,开发者可以以此为基础定义自己的自定义事件。 在 Spring 中,继承自 ApplicationEvent 的事件对象的监听者,可以由 Spring 容器进行管理,并在发布时通过 ApplicationEventPublisher 进行发布。这就避免了我们自己实现监听者的注册和通知过程,免去了很多繁杂的过程,使得更专心于业务本身。

在我看来,事件驱动机制,实际上就是一个逆推过程。一般来说,是执行函数操作之后产生事件,但事件驱动机制是根据产生的事件逆推出需要执行的操作。当然这也只是我的个人理解,毕竟一千个读者,一千个哈姆雷特。我们可以根据自己的需求,结合自己的特点来更好地理解事件驱动机制。

0人推荐
共同学习,写下你的评论
0条评论
携代码的男孩纸
程序员携代码的男孩纸

24篇文章贡献108038字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消