Java中的事件机制的参与者有3种角色:

1. event object:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在于listerner的方法之中
2. event source:具体的接受事件的实体,比如说,你点击一个button,那么button就是eventsource,这样你必须使button对某些事件进行响应,你就需要注册特定的listener,比如说MouseEvent之中的MouseClicked方法,这时它就必须有了add方法
3. event listener:具体的进行监听的事件类,当有其对应的event object产生的时候,它就调用相应的方法,进行处理。在windows程序设计里边这种响应使用callback机制来实现的

import org.junit.jupiter.api.Test;

public class MonitorTest {

    @Test
public void monitoringTest() throws Exception {
MonitorManager manager=new MonitorManager();
manager.addListener(new CarListener());
manager.addListener(new BicycleListener());
manager.addListener(new PersonListener());
manager.straight();
System.out.println("=======================");
manager.turnLeft();
}
}
import java.util.EventObject;

public class MonitorEvent extends EventObject {

    /**
* 1 直行绿灯
* 2 左拐绿灯
*/
private Integer heartRateValue; public MonitorEvent(Object source, Integer heartRateValue) {
super(source);
this.heartRateValue = heartRateValue;
} public Integer getHeartRateValue() {
return heartRateValue;
} public void setHeartRateValue(Integer heartRateValue) {
this.heartRateValue = heartRateValue;
}
}
import java.util.EventListener;

public interface MonitorListener extends EventListener {

    void monitorEvent(MonitorEvent event);

}
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class MonitorManager { private Collection listeners; //存储所有注册进来的事件监听器对象;
public void addListener(MonitorListener listener) //把一个事件监听器对象注册进来;
{
if(this.listeners == null)
{
this.listeners = new HashSet();
}
this.listeners.add(listener);
} public void removeListener(MonitorListener listener) //移除一个已经注册的事件监听器对象;
{
if(this.listeners != null)
{
this.listeners.remove(listener);
}
} /**
* 直行
*/
protected void straight()
{
if(this.listeners != null)
{
MonitorEvent event = new MonitorEvent(this, 1);
notifyListeners(event);
}
} /**
* 左拐
*/
protected void turnLeft() //触发开门事件
{
if(this.listeners != null)
{
MonitorEvent event = new MonitorEvent(this, 2);
notifyListeners(event);
}
} private void notifyListeners(MonitorEvent event)
{
Iterator inter = this.listeners.iterator();
while(inter.hasNext())
{
MonitorListener listener = (MonitorListener)inter.next();
listener.monitorEvent(event);
}
}
}

===管理类

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class MonitorManager { private Collection listeners; //存储所有注册进来的事件监听器对象;
public void addListener(MonitorListener listener) //把一个事件监听器对象注册进来;
{
if(this.listeners == null)
{
this.listeners = new HashSet();
}
this.listeners.add(listener);
} public void removeListener(MonitorListener listener) //移除一个已经注册的事件监听器对象;
{
if(this.listeners != null)
{
this.listeners.remove(listener);
}
} /**
* 直行
*/
protected void straight()
{
if(this.listeners != null)
{
MonitorEvent event = new MonitorEvent(this, 1);
notifyListeners(event);
}
} /**
* 左拐
*/
protected void turnLeft()
{
if(this.listeners != null)
{
MonitorEvent event = new MonitorEvent(this, 2);
notifyListeners(event);
}
} /**
* 通知每一个注册上来的监测,去执行
* @param event
*/
private void notifyListeners(MonitorEvent event)
{
Iterator inter = this.listeners.iterator();
while(inter.hasNext())
{
MonitorListener listener = (MonitorListener)inter.next();
listener.monitorEvent(event);
}
}
}

===三个具体的类

public class CarListener implements MonitorListener {

    public void monitorEvent(MonitorEvent event) {
if (event.getHeartRateValue() == 1) {
System.out.println("直行绿灯 汽车 可直行");
}
if (event.getHeartRateValue() == 2) {
System.out.println("左拐绿灯 汽车 可左拐");
}
}
}
public class BicycleListener implements MonitorListener {

    public void monitorEvent(MonitorEvent event) {
if (event.getHeartRateValue() == 1) {
System.out.println("直行绿灯 自行车 可直行");
}
if (event.getHeartRateValue() == 2) {
System.out.println("左拐绿灯 自行车 可左拐");
}
}
}
public class PersonListener implements MonitorListener {

    public void monitorEvent(MonitorEvent event) {
if (event.getHeartRateValue() == 1) {
System.out.println("直行绿灯 人 可直行");
}
if (event.getHeartRateValue() == 2) {
System.out.println("左拐绿灯 人 不可通行");
}
}
}

Java 事件链的更多相关文章

  1. JAVA防盗链在报表中的应用实例

    今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...

  2. Java 事件机制

    java事件机制包括三个部分:事件.事件监听器.事件源. 1.事件.一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,用于listener的相应的方法之中,作 ...

  3. java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  4. java 事件监听 - 键盘

    java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...

  5. java 事件监听 - 控件

    java 事件监听 //事件监听 //事件监听,写了一个小案例,点击按钮改变面板的颜色. import java.awt.*; import javax.swing.*; import java.aw ...

  6. JavaScript编程:java事件模型

    3.java事件模型: 传统事件处理程序指派方法:          1.var odiv=document.getElementById("div1");             ...

  7. JAVA事件监听机制学习

    //事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...

  8. java事件监听机制

    1.简单的事件监听 package demo2; /* * java事件监听机制 */ import java.awt.*; import javax.swing.*; import java.awt ...

  9. java责任链模式及项目实际运用

    1.前言 上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用.如何快速搭建责任链模式的项目中运用. 2.简单技术准备 我们要在项目中使用借助这样的几个知识的组合运 ...

  10. Java事件监听器的四种实现方式

    自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...

随机推荐

  1. 【Spring】事务实现原理

    在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,Spring事务底层是通过AOP来实现的,所以启用事务后,同样会向容器中注入一个代理对象创建器,AOP使 ...

  2. 【腾讯云 HAI域探秘】探索AI绘画之路:利用腾讯云HAI服务打造智能画家

    前言 随着人工智能的飞速发展,AI在艺术创作领域的应用正经历着一场革命性的变革.在这个数字时代,腾讯云的高性能应用服务HAI(Hyper Application Inventor)为艺术家和创作者提供 ...

  3. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-26-处理单选和多选按钮-下篇

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用Playwright来遍历单选和多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选和多选按 ...

  4. Kubernetes 漫游:etcd

    概述 etcd 是一个基于 Raft 协议实现.开源的.分布式的键值存储系统.主要用于在分布式系统中提供强一致性和高可用性的数据存储. etcd 在 Kubernetes 中的作用如下: 集群状态数据 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (143)-- 算法导论12.1 3题

    三.用go语言,设计一个执行中序遍历的非递归算法.(提示:一种容易的方法是使用栈作为辅助数据结构;另一种较复杂但比较简洁的做法是不使用栈,但要假设能测试两个指针是否相等.) 文心一言,代码正常运行: ...

  6. Access denied for user ‘root‘@‘localhost‘ (using password:YES)解决方法

    修改jdbc.properties文件的密码

  7. Oracle ADG容灾端部署Rman备份的一些实践经验

    随着数据库中数据量的不断增加.业务的复杂性提高.各种政策颁布的系统容灾等级要求,数据库备份的工作及备份文件的有效性及备份文件的管理变得愈发重要.在Oracle数据库中提供了强大的备份和恢复工具,其中R ...

  8. 聊一聊 .NET高级调试 中的一些内存术语

    一:背景 1. 讲故事 在高级调试的旅程中,经常会有一些朋友问我什么是 工作集(内存),什么是 提交大小,什么是 Virtual Size, 什么是 Working Set ...截图如下: 既然有很 ...

  9. [计蒜客20191103C] 分组

    小 C 是 \(n\) 个学生的老师,他现在要把所有学生分成两组,他会按照以下这些要求: 1.如果两个同学是好朋友那么他们就不会被分到同一组 2.小 C 想最小化两组人数差值 现在请你写一个程序来帮助 ...

  10. 4 HTTP的“四层”和“七层”

    目录 1 四层:TCP/IP 网络分层模型 2 七层:OSI网络分层模型 3 TCP/IP 协议栈的工作方式 1 四层:TCP/IP 网络分层模型 四层是指TCP/IP 网络分层模型. 第一层:&qu ...