监听器模型涉及以下三个对象,模型图如下:

(1)事件:用户对组件的一个操作,称之为一个事件
(2)事件源:发生事件的组件就是事件源
(3)事件监听器(处理器):监听并负责处理事件的方法

执行顺序如下:

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

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

1、注册监听器:事件源.setListener;
2、回调:事件源实现onListener。

下面,来看两个demo。

一、简化了上图所示的模型,仅仅包含事件源与监听器

  1. /*
  2. * 事件源:事件发生的地点
  3. */
  4. public class EventSource {
  5. private IEventListener mEventListener;
  6. // 注册监听器
  7. public void setEventListener(IEventListener arg) {
  8. mEventListener = arg;
  9. }
  10. // 触发事件
  11. public void EventHappened() {
  12. mEventListener.onclickButton();
  13. }
  14. }
/*
* 事件源:事件发生的地点
*/
public class EventSource {
private IEventListener mEventListener; // 注册监听器
public void setEventListener(IEventListener arg) {
mEventListener = arg;
} // 触发事件
public void EventHappened() {
mEventListener.onclickButton();
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  1. /*
  2. * 事件监听器,事件处理器
  3. */
  4. public interface IEventListener {
  5. void onclickButton();
  6. }
/*
* 事件监听器,事件处理器
*/
public interface IEventListener {
void onclickButton();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. public class Test {
  2. public static void main(String[] args) {
  3. // 事件源(被监听的对象)
  4. EventSource m1 = new EventSource();
  5. // 监听器
  6. IEventListener mEventListener = new IEventListener() {
  7. @Override
  8. public void onclickButton() {
  9. // TODO Auto-generated method stub
  10. System.out.println(”你点击了按钮”);
  11. }
  12. };
  13. // 注册监听器到事件源
  14. m1.setEventListener(mEventListener);
  15. m1.EventHappened();
  16. }
  17. }
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();
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

二、完整模型的demo

  1. /*
  2. * 事件
  3. */
  4. public interface IEvent {
  5. void setEventListener(IEventListener arg);
  6. boolean ClickButton();
  7. boolean MoveMouse();
  8. }
/*
* 事件
*/
public interface IEvent { void setEventListener(IEventListener arg); boolean ClickButton(); boolean MoveMouse(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. /*
  2. * 事件监听器,调用事件处理器
  3. */
  4. public interface IEventListener {
  5. void doEvent(IEvent arg);
  6. }
/*
* 事件监听器,调用事件处理器
*/
public interface IEventListener { void doEvent(IEvent arg);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. /*
  2. * 事件源:事件发生的地点
  3. */
  4. public class EventSource implements IEvent{
  5. private IEventListener mEventListener;
  6. boolean button;
  7. boolean mouse;
  8. //注册监听器
  9. @Override
  10. public void setEventListener(IEventListener arg){
  11. mEventListener = arg;
  12. }
  13. //触发事件
  14. public void mouseEventHappened(){
  15. mouse = true;
  16. mEventListener.doEvent(this);
  17. }
  18. @Override
  19. public boolean ClickButton() {
  20. return button;
  21. // TODO Auto-generated method stub
  22. }
  23. @Override
  24. public boolean MoveMouse() {
  25. // TODO Auto-generated method stub
  26. return mouse;
  27. }
  28. }
/*
* 事件源:事件发生的地点
*/
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;
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  1. public class EventSource2 implements IEvent {
  2. private IEventListener ml;
  3. boolean button;
  4. boolean mouse;
  5. @Override
  6. public void setEventListener(IEventListener arg) {
  7. ml = arg;
  8. }
  9. @Override
  10. public boolean ClickButton() {
  11. // TODO Auto-generated method stub
  12. return button;
  13. }
  14. @Override
  15. public boolean MoveMouse() {
  16. // TODO Auto-generated method stub
  17. return mouse;
  18. }
  19. // 触发事件
  20. public void buttonEventHappened() {
  21. button = true;
  22. ml.doEvent(this);
  23. }
  24. }
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);
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  1. public class Test {
  2. public static void main(String[] args) {
  3. // 事件源(被监听的对象)
  4. EventSource m1 = new EventSource();
  5. EventSource2 m2 = new EventSource2();
  6. // 监听器
  7. IEventListener mEventListener = new IEventListener() {
  8. @Override
  9. public void doEvent(IEvent arg) {
  10. if (true == arg.ClickButton()) {
  11. System.out.println(”你点击了按钮”);
  12. }else if(true == arg.MoveMouse()){
  13. System.out.println(”你移动了鼠标”);
  14. }
  15. }
  16. };
  17. // 注册监听器到事件源
  18. m1.setEventListener(mEventListener);
  19. m1.mouseEventHappened();
  20. // 注册监听器到事件源
  21. m2.setEventListener(mEventListener);
  22. m2.buttonEventHappened();
  23. }
  24. }
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();
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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

java监听器原理理解与实现的更多相关文章

  1. JAVA监听器原理

    http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...

  2. Java监听器原理及实例

    一.监听器原理 监听器是基于事件驱动的,用于对操作事件进行监听.处理,是观察者设计模式的应用 监听器三元素: 2.1 事件源:事件发生的源头 2.2 事件:对事件进行抽象.封装 2.3 监听器:用于监 ...

  3. java的classLoader原理理解和分析

    java的classLoader原理理解和分析 学习了:http://blog.csdn.net/tangkund3218/article/details/50088249 ClassNotFound ...

  4. 深入理解Java类加载器(一):Java类加载原理解析

    摘要: 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制.本文简述了JVM三种预定义类加载器,即 ...

  5. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  6. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

  7. Java跨平台原理

    此篇博文主要源自网络xiaozhen的天空的博客:http://xiaozhen1900.blog.163.com/blog/static/1741732572011325111945246/ 1.是 ...

  8. 【转】Java跨平台原理

    原文地址:http://www.cnblogs.com/gw811/archive/2012/09/09/2677386.html 1.是么是平台 Java是可以跨平台的编程语言,那我们首先得知道什么 ...

  9. 《Java虚拟机原理图解》 1.2、class文件里的常量池

    [最新更新:2014/11/11]  了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...

随机推荐

  1. django TimedRotatingFileHandler log

    15.9.6. TimedRotatingFileHandler¶ The TimedRotatingFileHandler class, located in the logging.handler ...

  2. oracle单实例12.2.0.1安装

    说明:本文描述oracle linux 6.8 安装 oracle 12.2.0.1 0. 查看操作系统版本 [root@12c01 ~]# cat /etc/os-release NAME=&quo ...

  3. 使用Visual Studio进行单元测试-Part1

    写在开头:Coding ain't done until all the tests run. No unit test no BB. -------------------------------- ...

  4. spring IOC 注解@Resource

    1.@Resource(重要)a)加入 :j2ee/common-annotations.jar b)默认按名称,名称找不到,按类型 默认按照名称setName1到xml中找和id相同的,没有的话再找 ...

  5. 利用SharedRegion实现核间共享

    导入SharedRegion模块 SharedRegion模块是一个共享区域,特别是对于多处理器环境下,SharedRegion模块就是用于让一个内存区域能被不同处理器共享并操作.这个模块会给每个处理 ...

  6. ios判断是否为iphone6或iphone6plus代码

    转自:http://blog.csdn.net/lvxiangan/article/details/45288505 #define IS_IPAD (UI_USER_INTERFACE_IDIOM( ...

  7. mybatis---demo1--(1-n)----bai

    实体类1: package com.etc.entity; import java.util.List; public class Teacher { private int tid; private ...

  8. commons-configuration读取配置文件

    关键工具类: import org.apache.commons.configuration.CompositeConfiguration; import org.apache.commons.con ...

  9. Levenberg-Marquardt优化算法以及基于LM的BP-ANN

    一.LM最优化算法     最优化是寻找使得目标函数有最大或最小值的的参数向量.根据求导数的方法,可分为2大类.(1)若f具有解析函数形式,知道x后求导数速度快.(2)使用数值差分来求导数.根据使用模 ...

  10. Spring 3.x 企业引用开发实战(陈雄华/林开雄)

    目录 ... 第一章:Spring概述 IoC:BeanFactory.Context.El(SpringEL表达式) AOP:允许JVM虚拟机启动时使用代理类在运行时期修改指定类的字节码,改变一个类 ...