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
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!