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. 圆方树 useful things

    圆方树,是解决仙人掌问题的实用方法,假设最初图都是圆点,对于每个环新建一个方点并连接这个环上所有圆点,能很好规避同一个点可能属于很多个环的情况,并且发现build完之后是一棵树 广义圆方树,能够不局限 ...

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

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

  3. 栈与队列应用:迷宫问题(DFS非最短路径)

    //先输入行列,在输入迷宫 以-1 -1 结束 #include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define ...

  4. Windows 11 + Samsung 980 踩坑:在 LocalDB 15.0 实例启动期间出错: 无法启动 SQL Server 进程(附赠 查询指定日期范围内的前1000条SQL执行记录)

    Windows 11 + Samsung 980 踩坑:在 LocalDB 实例启动期间出错: 无法启动 SQL Server 进程 起因 用 Microsoft Visual Studio 2022 ...

  5. 利用 Excel 对学生的成绩进行分析管理

    利用 Excel 对学生的成绩进行分析和管理是一种常见且有效的方法.以下是一些步骤和技巧,以帮助您实施这一过程: 1. 数据输入:将学生成绩数据输入到 Excel 中的一个工作表中.每个学生可以有一行 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题

    二.用go语言,假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树.证明:在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1. 文心一言: 为了证明这个结论 ...

  7. SpringBoot启动@Test单元测试时,一致卡在加载junit-bom-5.6.3.pom.xml文件

    今天做项目时创建一个SpringBoot工程,使用的版本是<spring-boot.version>2.3.7.RELEASE</spring-boot.version> 当我 ...

  8. Charles对Android手机Https请求的抓包

    Charles对Android手机Https请求的抓包 • 前情提要: 本文只是对android手机进行抓包的描述,由于android手机系统原因,android7.0系统及以上需要在app中配置证书 ...

  9. vscode下载

    vscode下载 想下载官网可以直接去官网下载(速度超慢~) 百度网盘链接: 链接:https://pan.baidu.com/s/14DfWI5b2HA_J_kHBcu8JQw?pwd=yyds 提 ...

  10. 【C# 技术】C# 常用排序方式

     前言  在最近的项目中经常会对C#中的数据进行排序,对于基本数据类型,其排序方式比较简单,只需要调用内置算法即可实现,但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦,所以在本文章中将 ...