监听器模型涉及以下三个对象,模型图如下:
(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() {
-
- @Override
- public void onclickButton() {
-
- System.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;
-
-
- @Override
- public void setEventListener(IEventListener arg){
- mEventListener = arg;
- }
-
-
- public void mouseEventHappened(){
- mouse = true;
- mEventListener.doEvent(this);
- }
-
- @Override
- public boolean ClickButton() {
- return button;
-
-
- }
-
- @Override
- public boolean MoveMouse() {
-
- 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() {
-
- return button;
- }
-
- @Override
- public boolean MoveMouse() {
-
- 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();
- }
- }
【实验结果】
你移动了鼠标
你点击了按钮
java监听器的原理与实现
原文:http://www.cnblogs.com/devin-ou/p/7989640.html