65.9K
CodeProject 正在变化。 阅读更多。
Home

Linkset 获得了事件总线功能

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2010年10月13日

LGPL3

2分钟阅读

viewsIcon

17629

downloadIcon

139

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 日:初始版本
© . All rights reserved.