Linkset 获得了事件总线功能





0/5 (0投票)
LinkSet 是一个小型库,旨在减轻程序员声明监听器接口的负担。
正如 上一篇文章 中描述的,LinkSet 是一个小型库,旨在减轻程序员声明监听器接口的负担。它利用 Java 5 的特性,并被设计为传统“监听器接口 + 匿名类”解决方案的直接替代品。现在它具有事件总线功能。
引言
当我创建 LinkSet (github.com/lbownik/linkset) 时,我考虑的是监听器,但一段时间后,我意识到相同的机制可以用来创建易于使用的事件总线。
使用事件总线
如果您想了解如何使用基本的 Linkset 功能,请阅读 上一篇文章。
一个事件
为了使用事件总线,您需要声明一个事件类型。事件可以是任何类型。它不需要实现任何接口或继承任何类。它可以是任何 Java 对象,甚至像这样简单...
package package com.mycompany.project1;
public class Event {
}
简单的事件总线
下面的代码展示了如何实现一个可以发出事件的类。
package com.mycompany.project1;
import org.linkset.DefaultListenerManager;
import org.linkset.ListenerManager;
import org.linkset.MethodPointer;
public class EventSource {
public static EventBus eventBus = new SimpleEventBus();
public void fireEvents() {
eventBus.fire(new Event());
}
}
该类声明了一个 static
事件总线对象,然后触发一个事件。它不需要任何运行时或编译支持即可工作。
事件处理器
以下代码展示了如何实现一个提供监听事件方法的类。
package com.mycompany.project1;
import org.linkset.HandlerMethod;
import org.linkset.MethodPointer;
public class EventHandler {
public EventHandler() {
EventSource.eventBus.add(Event.class, this, "eventHandler");
}
@HandlerMethod(id = "eventHandler")
private void eventHandler(final Event event) {
System.out.println("Event handled.");
}
}
该类声明了一个处理事件的方法,并使用一行代码将自身注册为特定类型事件的处理程序...
EventSource.eventBus.add(Event.class, this, "eventHandler");
感知层级的事件总线
LinkSet 使利用事件类型层级信息成为可能。例如,如果您想监视一组事件类型,您可以注册一个处理所有特定类型子事件的事件处理程序。
下面的代码引入了一个子事件...
package package com.mycompany.project1;
public class SubEvent extends Event {
}
...一个事件源声明了一个感知事件层级的事件总线...
package com.mycompany.project1;
import org.linkset.DefaultListenerManager;
import org.linkset.ListenerManager;
import org.linkset.MethodPointer;
public class EventSource {
public static EventBus eventBus = new HierarchyAwareEventBus();
public void fireEvents() {
eventBus.fire(new SubEvent());
}
}
...并且一个事件目标声明了针对子事件和超类型事件的单独处理程序。
package com.mycompany.project1;
import org.linkset.HandlerMethod;
import org.linkset.MethodPointer;
public class EventHandler {
public EventHandler() {
EventSource.eventBus.add(Event.class, this, "monitor");
EventSource.eventBus.add(Event.class, this, "subEventHandler");
}
@HandlerMethod(id = "subEventHandler")
private void eventHandler(final SubEvent event) {
System.out.println("SubEvent handled.");
}
@HandlerMethod(id = "monitor")
private void eventMonitor(final Event event) {
System.out.println("Event monitored");
}
}
每次触发 SubEvent
时,两个处理程序都会被调用。
摘要
LinkSet 是一个关于轻量级、动态 Java 监听器(现在包括事件总线)的小实验。
如果您喜欢它...请享受使用它...并在 github.com/lbownik/linkset 上报告错误。
历史
- 2010 年 10 月 11 日:初始版本