概念:

  监听器就是一个实现特定接口的普通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. 对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。

    项目中需要实现视频通话功能,经过公司的赛选,采用网易云信的视频通话服务,app小伙伴集成很顺利.web端需要实现呼叫app端用户.网易云信文档介绍不全,vue的demo满足不了需求,和客服人员沟通,只 ...

  2. PHP DateTime类常用方法总结

    实例化: $date = new DateTime(); $date = new DateTime('2018-01-01'); $date = new DateTime('tomorrow'); $ ...

  3. SpringBoot 之 JSR303 数据校验

    使用示例: @Component @ConfigurationProperties(prefix = "person") @Validated //使用数据校验注解 public ...

  4. Python中单下划线与双下划线用法总结

    看mentor的脚本时,遇到self._item.callspec.getparam('')语句,理解起来比较困难,找到一篇文章,记录的比较详细,特别记录一下,以备复习. 附链接地址:http://w ...

  5. Calendar日期往后一天,一月等

    import java.util.Date ;       Date date=new   Date();//取时间 System.out.println(date.toString());     ...

  6. 使用.NET 6开发TodoList应用(25)——实现RefreshToken

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在上一篇文章使用.NET 6开发TodoList应用(24)--实现基于JWT的Identity功能中,我们演示了如何使用.N ...

  7. 【Java】枚举类

    文章目录 枚举类的使用 如何定义枚举类 方式一:jdk5.0之前,自定义枚举类 方式二:jdk5.0,可以使用enum关键字定义枚举类 Enum类的主要方法 toString() values() v ...

  8. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  9. 【机器学习】GMM和EM算法

    机器学习算法-GMM和EM算法 目录 机器学习算法-GMM和EM算法 1. GMM模型 2. GMM模型参数求解 2.1 参数的求解 2.2 参数和的求解 3. GMM算法的实现 3.1 gmm类的定 ...

  10. 【刷题-LeetCode】307. Range Sum Query - Mutable

    Range Sum Query - Mutable Given an integer array nums, find the sum of the elements between indices ...