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

执行顺序如下:
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() {@Overridepublic void onclickButton() {// TODO Auto-generated method stubSystem.out.println('你点击了按钮');}};// 注册监听器到事件源m1.setEventListener(mEventListener);m1.EventHappened();}}
【实验结果】
你点击了按钮
二、完整模型的demo
/** 事件*/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;//注册监听器@Overridepublic void setEventListener(IEventListener arg){mEventListener = arg;}//触发事件public void mouseEventHappened(){mouse = true;mEventListener.doEvent(this);}@Overridepublic boolean ClickButton() {return button;// TODO Auto-generated method stub}@Overridepublic boolean MoveMouse() {// TODO Auto-generated method stubreturn mouse;}}
public class EventSource2 implements IEvent {private IEventListener ml;boolean button;boolean mouse;@Overridepublic void setEventListener(IEventListener arg) {ml = arg;}@Overridepublic boolean ClickButton() {// TODO Auto-generated method stubreturn button;}@Overridepublic boolean MoveMouse() {// TODO Auto-generated method stubreturn 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() {@Overridepublic 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();}}
【实验结果】
你移动了鼠标
你点击了按钮
赞 (0)
