Java设计模式的事件模型详解
作者:一只懒惰的小虫子 发布时间:2023-11-29 04:47:08
标签:Java,设计模式,事件,模型
监听模式
事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给 * ,当事件源触发事件后, * 接收到事件对象可以回调事件的方法。
参与的角色
事件模型有三种角色参与,分别是:事件源、事件、事件 * 。
事件
事件继承自java.util.EventObject
类,封装了事件源对象及跟事件相关的信息,代码可以说是很简单了。
public class EventObject implements java.io.Serializable {
/**
* 事件源
*/
protected transient Object source;
public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");
this.source = source;
}
public Object getSource() {
return source;
}
public String toString() {
return getClass().getName() + "[source=" + source + "]";
}
}
事件源
事件源是事件发生的地方,由于事件源的某项属性或状态发生了改变,
例如鼠标点击事件。
事件 *
事件 * 实现java.util.EventListener
接口,注册在事件源上,当事件源的属性或状态改变时,取得相应的 * 调用其内部的回调方法。最简单的代码,没有之一。
package java.util;
public interface EventListener {
}
事件、事件源、 * 之间的关系
首先产生一个事件源(EventSource),然后事件(EventObject)封装事件源信息和事件信息,事件发生,事件源注册 * ,通知 * , * 处理事件。
举个粒子
事件对象
public class EventObject implements java.io.Serializable {
/**
* 事件源
*/
protected transient Object source;
public EventObject(Object source) {
if (source == null)
throw new IllegalArgumentException("null source");
this.source = source;
}
public Object getSource() {
return source;
}
public String toString() {
return getClass().getName() + "[source=" + source + "]";
}
}
事件对象Event继承EventObject,封装了事件源
import java.util.EventObject;
public class Event extends EventObject {
public Event(Object source) {
super(source);
}
}
事件源,事件源注册了事件 *
import java.util.HashSet;
import java.util.Set;
public class Source {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
private final Set<Listener> listenerSet = new HashSet<>();
public void registerEventListener(Listener eventListener) {
if (eventListener != null) {
listenerSet.add(eventListener);
}
}
public void handle() {
for (Listener eventListener : listenerSet) {
Event event = new Event(this);
eventListener.callback(event);
}
}
}
事件 *
import java.util.EventListener;
public interface Listener extends EventListener {
void callback(Event e);
}
测试
public class Test {
public static void main(String[] args) {
Source source = new Source();
source.setName("鼠标点击");
System.out.println(source.getName());
source.registerEventListener((event) -> {//这里是处理逻辑
System.out.println("鼠标事件回调被执行了---");
System.out.println("当前线程名称:"+Thread.currentThread().getName());
});
source.handle();
}
}
执行结果
来源:https://blog.csdn.net/Strange_boy/article/details/123530896


猜你喜欢
- 本文实例讲述了C#操作session的类。分享给大家供大家参考。具体分析如下:这个C#类对session操作进行了再次封装,可以大大简化se
- @RequestBody部分属性丢失问题描述JavaBean实现public class VerifyNewFriendApplyReq i
- 看到某些App里面有读取联系人的功能,然后自己尝试了一下。发现这个挺简单的。然后自己就做了一个demo给大家,希望借这个demo可以让大家学
- CSV(Comma Separated Values)文件是一种纯文本文件,包含用逗号分隔的数据,常用于将数据从一个应用程序导入或导出到另一
- 本文实例讲述了C#实现两接口中同名方法。分享给大家供大家参考。具体分析如下:对于一个类实现两个接口,而这两个接口又有同名方法,C#中的处理方
- 无聊逛论坛,发现了这张图真是厉害啊,这排序, 既有多线程,又有排序,还有lambda表达式,但是这是C#版本,作为一个入坑的Java爱好者,
- 概述Spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配
- AndroidStudio升级后, 新建类变成了下面这个样子, 并且默认还没有修饰符, 一堆大写的英文看的我一脸懵逼, 后来在stackov
- 建库建表DROP DATABASE IF EXISTS mp;CREATE DATABASE mp DEFAULT CHARACTER SE
- 1. 编译错误//代码1public static void test() throws Exception {throw ne
- 引言最近,各大平台都新增了评论区显示发言者ip归属地的功能,例如哔哩哔哩,微博,知乎等等。Java 中是如何获取 IP&
- 在学习monkeyrunner之前,让我们先搭建好eclipse安卓开发环境。对于程序开发人员而言,eclipse并不陌生,它提供了一个非常
- 一、背景介绍:我们在进行数据存储的时候,有时候会加入本地缓存、分布式缓存以及数据库存储 * 的结构,当我们取值的时候经常是像下面这样的流程:1
- 前言在我们公司里,不同的服务之间通过Feign进行远程调用,但是,我们在尝试使调用可重试时遇到了一个小问题,Feign框架本身可以配置的自己
- Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms,是因为 Android 设定的
- 前言Springboot应用在启动的时候分为两步:首先生成 SpringApplication 对象 ,运行 SpringApplicati
- 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史远比Java久
- 实例如下:/// <summary> /// 上传ftp服务 /// </summary>
- 使用Spring提供的CommandLineRunner接口可以实现了一个命令行应用程序。但是,参数/选项/参数处理却不是那么好。幸运的是,
- Java8 HashMap键与Comparable接口最容易使 HashMap 发生哈希冲突的方法是什么呢?我们可以创建一个类,让它的哈希函