Java监听器模式在实际中的应用

监听器模式是一种行为型设计模式,它允许对象之间通过监听和触发事件的方式实现解耦,提高代码的灵活性和可维护性。在监听器模式中,存在两类角色:事件源(Event Source)和监听器(Listener)。事件源负责产生事件,而监听器负责监听事件的发生并采取相应的行动。当事件源触发事件时,所有注册了对应类型监听器的对象都会得到通知,然后执行相应的操作。
监听器模式在Java开发中被广泛应用。在Java中,监听器模式通常通过定义接口和实现类来实现。例如,在Web应用中,监听器可以用于记录网站的刷新量,或者在服务器关闭时将数据保存到文件或数据库中。在JavaEE框架中,监听器也用于监听HttpSession的创建和销毁,以记录当前所有在线人数。
另外,监听器模式也存在于网络安全领域,特别是无线网络的安全。监听器模式或RFMON(射频监视器)模式允许具有无线网络接口控制器的计算机监视从无线网络接收到的所有流量,而无需首先与接入点或ad hoc网络相关联。这是802.11无线网卡可以运行的模式之一,为网络安全提供了重要支持。

步骤

1.定义事件源:事件源是触发事件的对象。它应该提供注册监听器和触发事件的方法。注册监听器的方法通常接受实现了监听器接口的对象作为参数,并将其添加到一个监听器列表中。触发事件的方法则遍历监听器列表,调用每个监听器的相应方法。
2.定义监听器接口【非必要,看需求】:监听器接口定义了当事件发生时应该执行的操作。通常,这个接口会包含一个或多个方法,这些方法将在事件发生时由事件源调用。
3.实现监听器【非必要,看需求】:你需要创建一个类来实现监听器接口,并在其中实现相应的方法。这些方法定义了当事件发生时应该执行的具体操作。
4.注册监听器:在你的代码中,你需要创建一个或多个监听器对象,并使用事件源提供的注册方法将它们注册到事件源上。
5.触发事件:当特定的事件发生时(例如,用户点击了一个按钮,或者某个数据发生了变化),事件源将遍历其监听器列表,并调用每个监听器的相应方法。

具体实现

  1. 创建一个实体类
import lombok.Data;@Data
public class DemoData {private Long id;private int code;private String msg;
}
  1. 定义事件源
import org.springframework.context.ApplicationEvent;
public class DemoDataEvent extends ApplicationEvent {private DemoData demoData;/*** Create a new {@code ApplicationEvent}.** @param source the object on which the event initially occurred or with* which the event is associated (never {@code null})*/public DemoDataEvent(DemoData source) {super(source);this.demoData = source;}public DemoData getData() {return this.demoData;}
}
  1. 注册监听器
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class DemoDataEventListener implements ApplicationListener<DemoDataEvent> {// 注册消息队列// ...@Overridepublic void onApplicationEvent(DemoDataEvent event) {if (event != null) {// 需要重新封装再此处填充sendData(event);}}private void sendData(DemoDataEvent event) {// 写入消息队列// ...// 或者执行对应的任务}}
  1. 触发事件
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;@Component
public class DemoDataEventPublisher implements ApplicationEventPublisherAware {private ApplicationEventPublisher publisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}public void publish(DemoData demoData) {DemoDataEvent demoDataEvent = new DemoDataEvent(demoData);publisher.publishEvent(demoDataEvent);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PCL】mac下安装PCL的安装与配置

【PCL】mac下安装PCL的安装与配置 PCL PCL官方文档 PCL&#xff08;Point Cloud Library&#xff09;是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C编程库&#xff0c;它实现了大量点云相关的通用算法和高效数据结构&#xff0c;涉及到点云获取、滤波、分割、配…

从静态到动态化,Python数据可视化中的Matplotlib和Seaborn

​​本文分享自华为云社区《Python数据可视化大揭秘&#xff1a;Matplotlib和Seaborn高效应用指南》&#xff0c;作者&#xff1a; 柠檬味拥抱。 安装Matplotlib和Seaborn 首先&#xff0c;确保你已经安装了Matplotlib和Seaborn库。如果没有安装&#xff0c;可以使用以下命令…

知识图谱推理算法综述(上):基于距离和图传播的模型

背景 知识图谱系统的建设需要工程和算法的紧密配合&#xff0c;在工程层面&#xff0c;去年蚂蚁集团联合 OpenKG 开放知识图谱社区&#xff0c;共同发布了工业级知识图谱语义标准 OpenSPG 并开源&#xff1b;算法层面&#xff0c;蚂蚁从知识融合&#xff0c;知识推理&#xff…

底部填充胶在汽车电子领域的应用有哪些?

底部填充胶在汽车电子领域的应用有哪些&#xff1f; 在汽车电子领域&#xff0c;底部填充胶被广泛应用于IC封装等&#xff0c;以实现小型化、高聚集化方向发展。 底部填充胶在汽车电子领域有多种应用&#xff0c;包括以下方面&#xff1a; 传感器和执行器的封装&#xff1a;汽车…

AJAX(一):初识AJAX、http协议、配置环境、发送AJAX请求、请求时的问题

一、什么是AJAX 1.AJAX 就是异步的JS和XML。通过AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。 2.XML 可扩展标记语言。XML被设计用来传输和…

工业级POE交换机的SSH配置步骤

工业级POE交换机的SSH&#xff08;Secure Shell&#xff09;配置可以通过以下步骤进行&#xff1a; 1. 连接到POE交换机&#xff1a;使用一个支持SSH协议的终端工具&#xff08;如PuTTY&#xff09;连接到POE交换机的管理接口。 2. 登录到POE交换机&#xff1a;输入正确的用户…

详解Java 中的 Lambda 表达式

引言&#xff1a; Lambda 表达式是 Java 8 中引入的一个重要特性&#xff0c;它可以使代码更加简洁、易读&#xff0c;并且更加具有函数式编程风格。Lambda 表达式本质上是一个匿名函数&#xff0c;它可以作为方法参数传递&#xff0c;也可以直接赋值给一个变量。 一、Lambda 表…

【数据结构与算法】直接插入排序和希尔排序

引言 进入了初阶数据结构的一个新的主题——排序。所谓排序&#xff0c;就是一串记录&#xff0c;按照其中的某几个或某些关键字的大小&#xff08;一定的规则&#xff09;&#xff0c;递增或递减排列起来的操作。 排序的稳定性&#xff1a;在一定的规则下&#xff0c;两个值…

电子方案:打地鼠

打地鼠玩具是一种经典的儿童游戏&#xff0c;它结合了电子技术来增加娱乐性和互动性。 电子技术的集成使得打地鼠玩具不仅能够提供基本的娱乐功能&#xff0c;还能够提供更多的互动性和游戏性。随着技术的发展&#xff0c;打地鼠玩具可能会包含更多的高级功能&#xff0c;如无…

如何使用 JavaScript 导入和导出 Excel

前言 在现代的Web应用开发中&#xff0c;与Excel文件的导入和导出成为了一项常见而重要的任务。无论是数据交换、报告生成还是数据分析&#xff0c;与Excel文件的交互都扮演着至关重要的角色。本文小编将为大家介绍如何在熟悉的电子表格 UI 中轻松导入 Excel 文件&#xff0c;…

Airflow【部署 01】调度和监控工作流工具Airflow官网Quick Start实操(一篇学会部署Airflow)

Airflow官网Quick Start实操 1.环境变量设置2.使用约束文件进行安装3.启动单机版3.1 快速启动3.2 分步骤启动3.3 启动后3.4 服务启动停止脚本 4.访问4.1 登录4.2 测试 来自官网的介绍&#xff1a; https://airflow.apache.org/ Airflow™是一个由社区创建的平台&#xff0c;以…

FFmpeg+mediamtx 实现将本地摄像头推送成RTSP流

文章目录 概要推流过程实现过程安装FFmpeg安装Mediamtx 启动推流 概要 FFmpegmediamtx实现将本地摄像头推送成RTSP流 FFmpeg 版本号为&#xff1a;N-114298-g97d2990ea6-20240321 mediamtx 版本号为&#xff1a;v1.6.0 推流过程 摄像头数据&#xff0c;经过ffmpeg的推流代码…

ESCTF-OSINT赛题WP

这你做不出来?check ESCTF{湖北大学_嘉会园食堂} 这个识图可以发现是 淡水渔人码头 但是 osint 你要发现所有信息 聊天记录说国外 同时 提示给了美国 你综合搜索 美国 渔人码头 在美国旧金山的渔人码头&#xff08;英语&#xff1a;Fisherman’s Wharf&#xff09;是一个著名旅…

ubuntu虚拟机扩展容量后,无效,其实还需要分配

参考这位大佬&#xff1a;https://www.cnblogs.com/learningendless/p/17718003.html 如果直接使用磁盘调整大小会发现有钥匙 会被锁住&#xff0c;无法调整&#xff0c;按照大佬步骤做&#xff0c;亲测有效

pandas中cumsum() 函数的应用

cumsum() 函数用于计算 DataFrame 或 Series 中数值型数据的累积和。它将沿着指定的轴&#xff08;行或列&#xff09;对数据进行累积求和&#xff0c;并返回一个具有相同形状的 DataFrame 或 Series。 下面是一个示例&#xff0c;说明如何使用 cumsum() 函数&#xff1a; im…

Android获取经纬度的最佳实现方式

Android中获取定位信息的方式有很多种&#xff0c;系统自带的LocationManager&#xff0c;以及第三方厂商提供的一些定位sdk&#xff0c;都能帮助我们获取当前经纬度&#xff0c;但第三方厂商一般都需要申请相关的key&#xff0c;且调用量高时&#xff0c;还会产生资费问题。这…

浅谈关于Linux的学习

Linux的整个知识构架是&#xff1a; 1、基本指令 2、系统编程 3、网络编程 指令只是很基础的一部分&#xff0c;学习Linux更加重要的是其底层原理的知识&#xff0c;需要从基本的指令开始&#xff0c;逐级而上&#xff0c;次第往深处挖掘。最后构建起整个的知识体系。而不是仅…

了解什么是Docker

了解什么是Docker Docker是一个开源的容器化平台&#xff0c;它使得开发者可以将应用程序及其依赖项打包到一个轻量级的、可移植的容器中。这些容器可以在任何支持Docker的系统上运行&#xff0c;确保了应用程序在不同环境之间的一致性和可移植性。&#xff0c;同时享受隔离性…

大数据中TopK问题

1.给定100个int数字&#xff0c;在其中找出最大的10个; import java.util.PriorityQueue;public class Main {public static void main(String[] args) {final int topK 3;int[] vec {4, 1, 5, 8, 7, 2, 3, 0, 6, 9};PriorityQueue<Integer> pq new PriorityQueue<…

java网络

服务端打印请求者的ip https://blog.csdn.net/qq_42405688/article/details/122225412 /*** 从HTTP请求中获取客户IP地址** param request http请求* return 客户IP地址*/public static String getIPAddress( HttpServletRequest request ){String ip null;String header re…