java监听器的原理与实现

监听器模型涉及以下三个对象,模型图如下:
(1)事件:用户对组件的一个操作,称之为一个事件
(2)事件源:发生事件的组件就是事件源
(3)事件监听器(处理器):监听并负责处理事件的方法
java监听器的原理与实现
文章图片


执行顺序如下:
1、给事件源注册监听器
2、组件接受外部作用,也就是事件被触发
3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
4、事件处理器启动,并执行相关的代码来处理该事件。


监听器模式:事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。
1、注册监听器:事件源.setListener;
2、回调:事件源实现onListener。



下面,来看两个demo。
一、简化了上图所示的模型,仅仅包含事件源与监听器

/* * 事件源:事件发生的地点 */ public class EventSource { private IEventListener mEventListener; // 注册监听器 public void setEventListener(IEventListener arg) { mEventListener = arg; } // 触发事件 public void EventHappened() { mEventListener.onclickButton(); }}

/* * 事件监听器,事件处理器 */ public interface IEventListener { void onclickButton(); }

public class Test { public static void main(String[] args) {// 事件源(被监听的对象) EventSource m1 = new EventSource(); // 监听器 IEventListener mEventListener = new IEventListener() {@Override public void onclickButton() { // TODO Auto-generated method stub System.out.println("你点击了按钮"); } }; // 注册监听器到事件源 m1.setEventListener(mEventListener); m1.EventHappened(); } }

【实验结果】
你点击了按钮

二、完整模型的demo 【java监听器的原理与实现】

/* * 事件 */ public interface IEvent { void setEventListener(IEventListener arg); boolean ClickButton(); boolean MoveMouse(); }

/* * 事件监听器,调用事件处理器 */ public interface IEventListener { void doEvent(IEvent arg); }

/* * 事件源:事件发生的地点 */ public class EventSource implements IEvent{ private IEventListener mEventListener; boolean button; boolean mouse; //注册监听器 @Override public void setEventListener(IEventListener arg){ mEventListener = arg; } //触发事件 public void mouseEventHappened(){ mouse = true; mEventListener.doEvent(this); } @Override public boolean ClickButton() { return button; // TODO Auto-generated method stub } @Override public boolean MoveMouse() { // TODO Auto-generated method stub return mouse; }}

public class EventSource2 implements IEvent { private IEventListener ml; boolean button; boolean mouse; @Override public void setEventListener(IEventListener arg) { ml = arg; } @Override public boolean ClickButton() { // TODO Auto-generated method stub return button; } @Override public boolean MoveMouse() { // TODO Auto-generated method stub return mouse; } // 触发事件 public void buttonEventHappened() { button = true; ml.doEvent(this); }}

public class Test { public static void main(String[] args) {// 事件源(被监听的对象) EventSource m1 = new EventSource(); EventSource2 m2 = new EventSource2(); // 监听器 IEventListener mEventListener = new IEventListener() {@Override public void doEvent(IEvent arg) { if (true == arg.ClickButton()) { System.out.println("你点击了按钮"); }else if(true == arg.MoveMouse()){ System.out.println("你移动了鼠标"); } } }; // 注册监听器到事件源 m1.setEventListener(mEventListener); m1.mouseEventHappened(); // 注册监听器到事件源 m2.setEventListener(mEventListener); m2.buttonEventHappened(); } }

【实验结果】
你移动了鼠标
你点击了按钮





    推荐阅读