Java 监听器(Listener)的原理与实现
监听器模型涉及以下三个对象,模型图如下:
1)事件:用户对组件的一个操作
2)事件源:发生事件的组件就是事件源
3)事件监听器(处理器):监听并负责处理事件的方法
执行顺序如下:
1、给事件源注册监听器
2、组件接受外部作用,也就是事件被触发
3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
4、事件处理器启动,并执行相关的代码来处理该事件。
监听器模式:
事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;
更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。
1、注册监听器:事件源.setListener
2、回调:事件源实现onListener
两个示例
示例一:简化了上图模型,仅仅包含事件源与监听器
项目文件结构:
IEventListener.java
package com.mimvp.event;
/**
* 事件监听器,事件处理器
*/
public interface IEventListener {
void onclickButton();
}
EventSource.java
package com.mimvp.event;
/**
* 事件源:事件发生的地点
*/
public class EventSource {
private IEventListener mEventListener;
public EventSource() {
// TODO Auto-generated constructor stub
}
// 注册监听器
public void setEventListener(IEventListener listener) {
this.mEventListener = listener;
}
// 触发事件
public void EventHappened() {
this.mEventListener.onclickButton();
}
}
EventTest.java
package com.mimvp.event;
public class EventTest {
public static void main(String[] args) {
// 事件源(被监听的对象)
EventSource eventSource = new EventSource();
// 监听器(实现接口方法)
IEventListener mEventListener = new IEventListener() {
@Override
public void onclickButton() {
// TODO Auto-generated method stub
System.out.println("You click button");
}
};
// 注册监听器到事件源
eventSource.setEventListener(mEventListener);
eventSource.EventHappened();
}
}
实验结果
You click button
示例二:完整模型的demo
项目文件结构:
IMEvent.java
package com.mimvp.event2;
/**
* 事件接口
*/
public interface IMEvent {
void setEventListener(IMEventListener iMEventListener);
boolean ClickButton();
boolean MoveMouse();
}
IMEventListener.java
package com.mimvp.event2;
/**
* 事件监听器,调用事件处理器
*/
public interface IMEventListener {
void doEvent(IMEvent iMEvent);
}
MEventSource.java
package com.mimvp.event2;
public class MEventSource implements IMEvent {
private IMEventListener iMEventListener;
boolean button;
boolean mouse;
public MEventSource() {
// TODO Auto-generated constructor stub
}
@Override
public void setEventListener(IMEventListener iMEventListener) {
this.iMEventListener = iMEventListener;
}
@Override
public boolean ClickButton() {
return this.button;
}
@Override
public boolean MoveMouse() {
return this.mouse;
}
// 触发事件
public void mouseEventHappened(){
this.iMEventListener.doEvent(this);
}
public void setButton(boolean button) {
this.button = button;
}
public void setMouse(boolean mouse) {
this.mouse = mouse;
}
}
MEventSource2.java
package com.mimvp.event2;
public class MEventSource2 implements IMEvent {
private IMEventListener iMEventListener;
boolean button;
boolean mouse;
public MEventSource2() {
// TODO Auto-generated constructor stub
}
public void setEventListener(IMEventListener iMEventListener) {
this.iMEventListener = iMEventListener;
}
@Override
public boolean ClickButton() {
return this.button;
}
// 触发事件
public void buttonEventHappened(){
button = true;
iMEventListener.doEvent(this);
}
@Override
public boolean MoveMouse() {
return this.mouse;
}
public void setButton(boolean button) {
this.button = button;
}
public void setMouse(boolean mouse) {
this.mouse = mouse;
}
}
EventTest.java
package com.mimvp.event2;
/**
* mimvp.com
*/
public class EventTest {
public static void main(String[] args) {
// 事件源(被监听的对象)
MEventSource mEventSource = new MEventSource();
MEventSource2 mEventSource2 = new MEventSource2();
// 监听器
IMEventListener iMEventListener = new IMEventListener() {
@Override
public void doEvent(IMEvent iMEvent) {
if(true == iMEvent.ClickButton()) {
System.out.println("You click button");
}
else if(true == iMEvent.MoveMouse()) {
System.out.println("You move mouse");
}
}
};
// 注册监听器到事件源
System.out.println("+++ mEventSource +++");
mEventSource.setEventListener(iMEventListener);
mEventSource.setMouse(true); // 赋值状态
mEventSource.mouseEventHappened(); // 触发鼠标事件
// 注册监听器到事件源
System.out.println("+++ mEventSource2 +++");
mEventSource2.setEventListener(iMEventListener);
mEventSource2.buttonEventHappened(); // 触发按钮事件
}
}
【实验结果】
+++ mEventSource +++
You move mouse
+++ mEventSource2 +++
You click button
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2017-05-04 23:22:32
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!


