java事件链效率_Java事件处理机制

1、事件角色

java中的事件机制的参与者有3种角色:

event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中

event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。

event listener:事件监听者。对每个明确的事件的发生,都相应地定义一个明确的Java方法。

2、Java 实现

主要的API:

事件状态类:java.util.EventObject

事件监听接口:java.util.EventListener

我们需要定义的类/接口有:

类名

功能

父类/父接口

事件状态类

持有事件触发改变的“状态属性”

EventObject

事件监听接口

定义事件触发以后,根据不同状态属性的抽象操作方法

EventListener

具体的监听实现类(可以有多个)

提供具体的,根据不同状态属性的操作

事件监听接口

事件源类

1、持有监听类,并提供注册功能

2、提供触发事件的功能,触发事件的同时,通知监听器

示例如下:

事件状态类:

/**

* Created by 兴趣使然的程序员 on 2017/7/12.

* 事件状态类

* 持有事件触发改变的“状态属性”

*/

public class EventState extends EventObject {

private String state;

public void setDoorState(String state) {

this.state = state;

}

public String getDoorState() {

return this.state;

}

/**

* Constructs a prototypical Event.

*

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

* @throws IllegalArgumentException if source is null.

*/

public EventState(Object source) {

super(source);

}

}

事件监听接口:

/**

* Created by 兴趣使然的程序员 on 2017/7/12.

* 事件监听接口

*/

public interface StateListener extends EventListener {

void doorEvent(EventState event);

}

事件源类:

/**

* Created by 兴趣使然的程序员 on 2017/7/12.

* 具体的事件源类

*

*/

public class EventSource {

private ConcurrentLinkedQueue listeners;

/**

* 添加监听

*/

public void addListener(StateListener stateListener) {

if (listeners == null) {

listeners = new ConcurrentLinkedQueue();

}

listeners.add(stateListener);

}

/**

* 移除监听

*/

public void removeListener(StateListener stateListener) {

if (listeners == null)

return;

listeners.remove(stateListener);

}

/**

* 触发事件,更改事件状态

*/

protected void fireStateChange(String doorState) {

if (listeners == null)

return;

EventState event = new EventState(this);

event.setDoorState(doorState);

notifyListeners(event);

}

/**

* 通知所有的DoorListener,让Listener对状态变化做出响应操作

*/

private void notifyListeners(EventState event) {

for(StateListener stateListener:listeners)

stateListener.doSomethingForEvent(event);

}

}

使用:

/**

* Created by 兴趣使然的程序员 on 2017/7/12.

*/

public class Test {

public static void main(String[] args) {

EventSource eventSource = new EventSource();

//添加一个监听,并同时定义根据事件状态变化做出的操作

eventSource.addListener(new ListenerA());

eventSource.fireStateChange("啦啦啦");

}

}

class ListenerA implements StateListener{

@Override

public void doSomethingForEvent(EventState event) {

String doorState = event.getDoorState();

System.out.println(doorState);

//触发事件以后,将自己移除

((EventSource)event.getSource()).removeListener(this);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值