Java设计模式的事件模型详解
作者:一只懒惰的小虫子 时间:2023-11-29 04:47:08
监听模式
事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给 * ,当事件源触发事件后, * 接收到事件对象可以回调事件的方法。
参与的角色
事件模型有三种角色参与,分别是:事件源、事件、事件 * 。
事件
事件继承自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
标签:Java,设计模式,事件,模型
0
投稿
猜你喜欢
JAVA JDK8 List分组获取第一个元素的方法
2021-06-24 13:07:51
android实现打地鼠游戏
2023-09-25 08:45:59
说说Android的UI刷新机制的实现
2022-11-26 22:34:21
SpringBoot中@ConditionalOnBean实现原理解读
2023-04-25 14:24:54
C#程序打成 一键安装包-InstallShield教程
2022-11-19 06:02:07
c# 实现RSA非对称加密算法
2021-10-15 10:54:06
Android实现简单的文件下载与上传
2022-02-25 00:00:14
Spring boot集成Kafka消息中间件代码实例
2022-11-06 21:53:48
Lombok为啥这么牛逼?SpringBoot和IDEA官方都要支持它
2021-10-18 23:04:50
Android Studio 3.0后出现AAPT2与“android.enableAapt2”问题的解决方法
2021-08-28 20:29:54
使用IDEA搭建一个简单的SpringBoot项目超详细过程
2022-07-19 11:43:58
Android开发之ToggleButton实现开关效果示例
2022-01-12 20:22:30
mybatis注入Date日期值为null的解决方法
2021-12-08 01:49:17
C#实现多个计时器记录不同定时时间
2023-01-31 17:56:33
Java实现五子棋游戏
2022-07-08 12:50:27
java实现多线程之定时器任务
2021-07-10 08:56:14
idea2017建立jsp工程及tomcat配置教程
2023-06-04 20:24:40
浅谈String.split()遇到空字符串的几种情况
2021-11-24 00:18:38
Android中的Looper对象详细介绍
2023-02-26 08:33:39
Java常用工具类汇总 附示例代码
2022-07-21 17:54:15