概念:

  监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

监听器组成要素:

  事件源:事件发生的源头,属于被监听的对象。例如一个开关

  事件对象:被用来包装事件源,比如开关打开、关闭事件。

  监听器:定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。

监听器原理:

实现简单监听器:

/**
* 事件源对象
*/
public class EventSource { private List<EventListener> listeventListeners = new ArrayList<>(); /**
* 注册监听器
* @param eventListener
*/
public void registerEventListener(EventListener eventListener){
listeventListeners.add(eventListener);
} /**
* 销毁监听器
* @param eventListener
*/
public void destroyEvnetListener(EventListener eventListener){
listeventListeners.remove(eventListener);
} /**
* 通知所有的监听器监听此事件对象
* @param eventObject
*/
public void notifyListener(EventObject eventObject){
listeventListeners.forEach(eventListener -> {
eventListener.handleEvent(eventObject);
});
} /**
* 事件源产生open事件对象
*/
public void open(){
EventObject eventObject = new EventObject("open");
notifyListener(eventObject);
} /**
* 事件源产生close事件对象
*/
public void close(){
EventObject eventObject = new EventObject("close");
notifyListener(eventObject);
}
}
/**
* 监听器接口
*/
public interface EventListener extends java.util.EventListener { /**
* 事件处理器
* @param eventObject
*/
void handleEvent(EventObject eventObject); }
/**
* 监听器接口实现类处理事件逻辑
*/
public class EventListenerImpl implements EventListener {
@Override
public void handleEvent(EventObject eventObject) { eventObject.doEvent();
if (eventObject.getSource().equals("open")) {
//当事件是open时业务逻辑
System.out.println("监听器执行方法:open....");
} if (eventObject.getSource().equals("close")) {
//当事件时close时业务逻辑
System.out.println("监听器执行方法:close....");
}
}
}
/**
* 事件对象
*/
public class EventObject extends java.util.EventObject { public EventObject(Object source) {
super(source);
} public void doEvent(){
System.out.println("事件源产生的事件对象:"+this.getSource());
}
}
/**
* 启动类
*/
public class TestListener {
public static void main(String[] args) {
//创建事件源对象
EventSource eventSource = new EventSource();
//创建监听器对象
EventListener eventListener1 = new EventListenerImpl();
EventListener eventListener2 = new EventListenerImpl();
//将监听器对象注册进事件源对象
eventSource.registerEventListener(eventListener1);
eventSource.registerEventListener(eventListener2);
//操作事件源产生事件
eventSource.open();
//销毁一个监听器
eventSource.destroyEvnetListener(eventListener1);
//操作事件源产生close事件
eventSource.close();
}

运行结果:

事件源产生的事件对象:open
监听器执行方法:open....
事件源产生的事件对象:open
监听器执行方法:open....
事件源产生的事件对象:close
监听器执行方法:close....

Process finished with exit code 0

监听器(Listener)详解及举例的更多相关文章

  1. Servlet 监听器Listener详解

    转自:http://blog.csdn.net/u012228718/article/details/41730799 一.简介 (一)概述 1.Listener 用于监听 Javaweb程序中的事件 ...

  2. java Web 监听器Listener详解

    简介 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext.HttpSession和 ServletRequest这三大域对象的创建 ...

  3. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  4. Servlet监听器详解及举例

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 ...

  5. java web学习总结(二十) -------------------监听器属性详解

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  6. iptables命令详解和举例

    网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助.网管员的安全意识要比空喊Linux安全重要得多. iptables -Fiptables -Xiptables -F ...

  7. java的移位运算详解(举例说明)

    1)java中无符号右移:>>>,下面是一个int型的负数,然后每次移动一位. int k = -0x123;System.out.println(Integer.toBinaryS ...

  8. Fragment详解及举例

    1.为什么用Fragment(Android3.0提出)来替代TabActivity(Android4.0以后正式被弃用)? 因为Fragment可以适应各种不同屏幕大小,也就是适应不同屏幕的分辨率. ...

  9. linux sed命令详解 --大量举例

    1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ...

随机推荐

  1. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  2. 『动善时』JMeter基础 — 60、固定吞吐量测试

    目录 1.定时器介绍 2.固定吞吐量定时器介绍 3.固定吞吐量定时器界面说明 4.固定吞吐量定时器的使用 (1)测试计划内包含的元件 (2)登陆请求内容 (3)固定吞吐量定时器内容 (4)线程组元件内 ...

  3. 文件挂载(一)- Linux挂载Linux文件夹

    一.概述 工作中经常会出现不同服务器.不同操作系统之间文件夹互相挂载的情形,例如文件服务器或数据备份服务器. 挂载一般来说就是以下四种类型: 同类型操作系统 a. linux挂载linux文件夹 b. ...

  4. Android开发 SeekBar(拖动条)的使用

    SeekBar是Progress的子类,Progress主要用来显示进度,但是不能和用户互动,而SeekBar则可以供用户进行拖动改变进度值 实现拖动进度条并显示在文本中: <?xml vers ...

  5. HTML网页设计基础笔记 • 【第2章 排列页面内容】

    全部章节   >>>> 本章目录 2.1 音频标签和视频标签 2.1.1 音频标签 2.1.2 视频标签 2.2 列表.div 以及 span 标签 2.2.1 列表标签 2. ...

  6. spring的返回json数据给前端注意事项

    1. 记得加入SpringJSON解析包,否则spring无法将返回的pojo类解析成json数据 maven则加上下面的依赖包 <!-- SpringJSON解析包--> <jac ...

  7. vert.x框架-使用spring注解功能

    1.前言 习惯了spring注解风格,方便好用,现在用vert.x框架,怎么使用spring注解呢? 2.maven安装依赖包 <!--spring注解依赖包--> <depende ...

  8. 深入理解MySQL索引底层数据结构

    作者:IT王小二 博客:https://itwxe.com MySQL 索引相关的数据结构有两种,一种是 B+tree,一种是 Hash,那么为什么在 99.99% 的情况下都使用的是 B+tree索 ...

  9. Flowable实战(八)BPMN2.0 任务

      任务是流程中最重要的组成部分.Flowable提供了多种任务类型,以满足实际需求.   常用任务类型有: 用户任务 Java Service任务 脚本任务 业务规则任务 执行监听器 任务监听器 多 ...

  10. 【刷题-PAT】A1135 Is It A Red-Black Tree (30 分)

    1135 Is It A Red-Black Tree (30 分) There is a kind of balanced binary search tree named red-black tr ...