事件派发器模式

作者: 程序熊大 | 来源:发表于2016-11-03 22:51 被阅读869次

在项目开发中,会遇到如下情形:我们自己的服务订阅、接收来自消息队列或者客户端的事件和请求,基于不同的事件采取对应的行动,这种情况下适合应用派发器模式。

主要模块

  1. XXXEventDispatcher类
    核心类,维护事件类型(EventType)到处理器(handler)的映射(存放在ConcurrentHashMap中);这个类在启动时,会通过XXXEventHandlerInitializer初始化这个map数据结构;在启动时,需要订阅或监听来自消息队列的事件;当对应的事件到达时,该类的dispatch方法会负责将事件分发到具体的处理器方法中进行处理。
package org.java.learn.java8.dispatcher;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2016/11/3
 * Time: 21:53
 */
@Component
public class XXXEventDispatcher implements AutoCloseable {
    @Resource
    private XXXEventHandlerInitializer initializer;

    private Map<XXXEventType, XXXEventHandler> handlers = new ConcurrentHashMap<>();

    @PostConstruct
    public void init() {
        //建立绑定关系;
        initializer.init();
        //监听事件并派发
        dispatch("testMsg");
    }

    /**
     * 将XXX事件注册到派发器
     *
     * @param xxxEventType
     * @param xxxEventHandler
     */
    public void bind(XXXEventType xxxEventType, XXXEventHandler xxxEventHandler) {
        this.handlers.put(xxxEventType, ((eventType, context) -> {
            try {
                xxxEventHandler.handle(eventType, context);
            } catch (Exception e) {
                //记录错误日志
                e.printStackTrace();
            }
            //打印处理器执行日志
        }));
    }

    /**
     * 进行事件派发
     * @param eventMsg
     */
    private void dispatch(String eventMsg) {
        //(1) 从eventMsg中获取eventType;
        //(2) 根据eventMsg构造eventContext;
        //(3) 执行具体的处理器方法
    }

    public void close() throws Exception {
        //释放资源
    }
}
  1. XXXEventHandlerInitializer类
    这个类包括具体的业务处理方法,在系统初始化的时候,会将这些业务处理方法的方法引用注册到派发器中。
package org.java.learn.java8.dispatcher;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2016/11/3
 * Time: 21:56
 */
@Component
public class XXXEventHandlerInitializer {
    @Resource
    private XXXEventDispatcher dispatcher;

    public void init() {
        dispatcher.bind(XXXEventType.event1, this::handleProcess1);
        dispatcher.bind(XXXEventType.event2, this::handleProcess2);
        dispatcher.bind(XXXEventType.event3, this::handleProcess3);
    }

    private void handleProcess1(XXXEventType eventType, XXXEventContext context) {
        //事件1的处理逻辑
    }

    private void handleProcess2(XXXEventType eventType, XXXEventContext context) {
        //事件2的处理逻辑
    }

    private void handleProcess3(XXXEventType eventType, XXXEventContext context) {
        //事件3的处理逻辑
    }
}
  1. XXXEventHandler:函数式接口
    函数式接口是Java 8 中实现Lambda函数式编程的基础工具,思想就是要讲函数作为参数传递。如下图所示,这些方法引用都是该函数式接口的实现。


    函数式接口的实现

    代码如下:

package org.java.learn.java8.dispatcher;
/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2016/11/3
 * Time: 22:03
 */
@FunctionalInterface
public interface XXXEventHandler {
    void handle(XXXEventType eventType, XXXEventContext context);
}
  1. XXXEventContext类
    这个类用于存储入参和返回值,具体情况可以灵活处理。
package org.java.learn.java8.dispatcher;
/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2016/11/3
 * Time: 22:04
 */
public class XXXEventContext {
    private int param1;
    private int param2;

    @Override
    public String toString() {
        return "XXXEventContext{" +
               "param1=" + param1 +
               ", param2=" + param2 +
               '}';
    }
}
  1. XXXEventType枚举
    这个类显然用于存储事件类型
package org.java.learn.java8.dispatcher;
/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2016/11/3
 * Time: 22:03
 */
public enum XXXEventType {
    event1,
    event2,
    event3
}

总结:在企业级开发中,有很多典型的应用场景和模式,事件派发器只是其中的一种,希望你也能够根据自己的实际情况加以应用。本文中提到的代码,参见我的github:LearnJava

相关文章

  • 事件派发器模式

    在项目开发中,会遇到如下情形:我们自己的服务订阅、接收来自消息队列或者客户端的事件和请求,基于不同的事件采取对应的...

  • 13. Tank_BP 派发器调用

    创建派发器 Event Dispatchers 绑定派发器 Bind Dispatcher 调用派发器 Call ...

  • 事件派发&事件监听

    派发事件 dispatchEvent dispatchEvent 向指定目标事件派发一个事件;一般的事件触发是用户...

  • 事件总线通信

    事件谁派发谁监听,这里事件都交给$bus派发和监听,在派发事件时调用回调函数 main.js 文件 跨越多层级的...

  • Java设计模式:事件驱动模式(观察者模式)

    Java设计模式——事件驱动模式(观察者模式) 角色 事件 事件源 事件监听器 事件 事件类一般继承自java.u...

  • java事件驱动模式(观察者模式)

    Java设计模式——事件驱动模式(观察者模式) 角色 事件 事件源 事件监听器 事件 事件类一般继承自java.u...

  • 事件委托与事件冒泡、事件捕获

    事件流 捕获阶段,window将事件派发到目标的这一过程 目标阶段,事件派发到目标元素的阶段,如果事件被处理成不进...

  • 2018-06-05 iOS蓝牙开发

    初始化 启动中心管理器 queue设为nil,中心管理器在主线程中派发事件。 跟踪设备蓝牙状态 中心管理器创建成功...

  • 事件派发dispatchEvent

    1、什么是dispatchEvent? dispatch意为“调度”、“派遣”,event为“事件”。所以disp...

  • 事件派发dispatchEvent

    点击b或者自执行b事件,将自动执行a事件 a bbb 原文作者:匆匆那年_海,博客主页:https://www....

网友评论

  • 胸前一朵小花花:可以看下 guava里提供的eventbus,提供了基于注解的接口无关的事件订阅与发布功能
    程序熊大: @胸前一朵小花花 好的👌,明天我试试😁
  • ZMMWMY:能不能写下是怎么派发的
    程序熊大:把函数的地址和事件名称放在一个map里,当一个事件到达时,有一个统一的处理入口,而这个入口会根据事件名称map到对应的函数,根据Java 8的lambda特性,会执行具体的函数

本文标题:事件派发器模式

本文链接:https://www.haomeiwen.com/subject/tvjiuttx.html