事件监听器 java_Java实现一个简单的事件监听器

关于事件监听我们需要知道的一些基础知识。

a)事件三要素(who when what):

source --事件源

when--事件发生时间

message-- 事件主题消息,即希望通过事件传递出去的信息

b)事件模型的构成:

event --事件

source--事件源

listener-- 事件监听器

c)事件流转过程:

(1)事件源注册监听器 -> (2)事件发生 -> (3)通知监听器 -> (4)监听器处理

那么基于以上背景知识,我们来是实现一个简单的监听器,并测试一下事件监听的完整流程。

根据事件三要素设计出一个简单合理的事件载体:Event

public interface Event extendsSerializable {

Object getSource();

Date getWhen();

String getMessage();/*** 事件回调方法*/

voidcallback();

}

事件实现:MyEvent

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public class MyEvent implementsEvent {private Log log =LogFactory.getLog(getClass());private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");privateObject source;privateDate when;privateString message;

@OverridepublicObject getSource() {returnsource;

}public voidsetSource(Object source) {this.source =source;

}

@OverridepublicDate getWhen() {returnwhen;

}public voidsetWhen(Date when) {this.when =when;

}

@OverridepublicString getMessage() {returnmessage;

}public voidsetMessage(String message) {this.message =message;

}

@Overridepublic voidcallback() {

log.info(toString());

}

@OverridepublicString toString() {return "source: " + getSource() + ", message: " + getMessage() + ", when: " +sdf.format(getWhen());

}

}

View Code

监听器接口:EventListener

public interfaceEventListener {/*** 事件触发

*@paramevent*/

voidhandleEvent(Event event);

}

监听器实现:MyListener

public class MyListener implementsEventListener {@Overridepublic voidhandleEvent(Event event) {event.callback();

}

}

事件源接口:EventSource

public interfaceEventSource {/*** 增加监听器

*@paramlistener*/

voidaddListener(EventListener listener);/*** 通知监听器*/

voidnotifyListener();

}

编写测试的事件源:MySource

public class MySource implementsEventSource {private List listeners = new ArrayList();private intvalue;

@Overridepublic voidaddListener(EventListener listener) {

listeners.add(listener);

}

@Overridepublic voidnotifyListener() {for(EventListener listener : listeners) {

MyEvent event= newMyEvent();

event.setSource(this);

event.setWhen(newDate());

event.setMessage("setValue " +value);

listener.handleEvent(event);

}

}public intgetValue() {returnvalue;

}public void setValue(intvalue) {this.value =value;

notifyListener();

}

@Testpublic voidtestEventListener() {

MySource source= newMySource();

source.addListener(newMyListener());

source.setValue(100);

}

}

测试输出:

[INFO]-[Event-callback(50)]: source: com.lichmama.test.listen.MySource@119126ab, message: setValue 100, when: 2018-05-01 02:52:13

*PS:监听器模式和观察者模式看起来很像,不过在事件模型的设置上有些许差别。在观察者模式中并没有Event这个角色,或者说它被合并到Observable角色中了,即整合了事件源与事件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值