Event Driven 设计模式(上)

Posted Alleria Windrunner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Event Driven 设计模式(上)相关的知识,希望对你有一定的参考价值。

Event-Driven Architecture 基础

EDA(Event-Driven Architecture)是一种实现组件之间松耦合、易扩展的架构方式,在本篇中,我们先介绍 EDA 的基础组件,让大家对 EDA 设计架构方式有一个基本的认识,一个最简单的 EDA 设计需要包含如下几个组件。
  • Events:需要被处理的数据

  • Event Handlers:处理 Events 的方式方法。

  • Event Loop:维护 Events 和 Event Handlers 之间的交互流程。

如下图所示,Event A 将被 Handler A 处理,而 Event B 将被 Handler B 处理,这一切的分配都是由 Event Loop 所控制的。

Events 是 EDA 中的重要角色,一个 Event 至少需要包含两个属性:类型和数据,Event 的类型决定了它会被哪个 Handler 处理,数据是在 Handler 中代加工的材料,下面写一个简单的程序,代码如清单所示。

Events
/***Event 只包含了该 Event 所属的类型和所包含的数据*/public class Event{ private final String type; private final String data;
public Event(String type, String data) { this.type = type; this.data = data; }
public String getType() { return type; }
public String getData() { return data;    }}


Event Handlers

Event Handlers 主要用于处理 Event,比如一些 filtering 或者 transforming 数据的操作等,下面我们写两个比较简单的方法,代码如下:


public static void handleEventA(Event e){ System.out.println(e.getData().toLowerCase());}
handleEventA 方法只是简单地将 Event 中的 data 进行了 lowerCase 之后的输出,代码如下:
public static void handleEventB(Event e){ System.out.println(e.getData().toUpperCase());}
同样,handleEventB 方法也是足够的简单,直接将 Event 中的字符串数据变成大写进行了控制台输出。


Event Loop

Event Loop 处理接收到的所有 Event,并且将它们分配给合适的 Handler 去处理,代码如下:
Event e;while (!events.isEmpty()){ //从消息队列中不断移除 Event,根据不同的类型进行处理 e = events.remove(); switch (e.getType()) { case "A": handleEventA(e); break; case "B": handleEventB(e); break; }}
在 EventLoop 中,每一个 Event 都将从 Queue 中移除出去,通过类型匹配交给合适的 Handler 去处理,完整的例子如清单所示。
import java.util.LinkedList;import java.util.Queue;public class FooEventDrivenExample{
//用于处理 A 类型的 Event public static void handleEventA(Event e) { System.out.println(e.getData().toLowerCase()); } //用于处理 B 类型的 Event public static void handleEventB(Event e) { System.out.println(e.getData().toUpperCase()); }
public static void main(String[] args) { Queue<Event> events = new LinkedList<>(); events.add(new Event("A", "Hello")); events.add(new Event("A", "I am Event A")); events.add(new Event("B", "I am Event B")); events.add(new Event("B", "World"));
Event e; while (!events.isEmpty()) { //从消息队列中不断移除,根据不同的类型进行处理 e = events.remove(); switch (e.getType()) { case "A": handleEventA(e); break; case "B": handleEventB(e); break; } } }}
虽然这个 EDA 的设计足够简单,但是通过它我们可以感受到 EDA 中三个重要组件之间的交互关系,运行上面的程序,输出结果如下:
helloi am event aI AM EVENT BWORLD

以上是关于Event Driven 设计模式(上)的主要内容,如果未能解决你的问题,请参考以下文章

干货 | 用FreeRTOS搭建Event-Driven应用框架

Event-Driven Architecture思考

5 Protocols For Event-Driven API Architectures

Flink学习入门教程之Event-driven Applications

IJCAI_论文-深度学习-Deep Learning for Event-Driven Stock Prediction

js经常用到的代码片段