Java 事件链
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 事件链的更多相关文章
- JAVA防盗链在报表中的应用实例
今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...
- Java 事件机制
java事件机制包括三个部分:事件.事件监听器.事件源. 1.事件.一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,用于listener的相应的方法之中,作 ...
- java 事件监听 - 鼠标
java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...
- java 事件监听 - 键盘
java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...
- java 事件监听 - 控件
java 事件监听 //事件监听 //事件监听,写了一个小案例,点击按钮改变面板的颜色. import java.awt.*; import javax.swing.*; import java.aw ...
- JavaScript编程:java事件模型
3.java事件模型: 传统事件处理程序指派方法: 1.var odiv=document.getElementById("div1"); ...
- JAVA事件监听机制学习
//事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...
- java事件监听机制
1.简单的事件监听 package demo2; /* * java事件监听机制 */ import java.awt.*; import javax.swing.*; import java.awt ...
- java责任链模式及项目实际运用
1.前言 上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用.如何快速搭建责任链模式的项目中运用. 2.简单技术准备 我们要在项目中使用借助这样的几个知识的组合运 ...
- Java事件监听器的四种实现方式
自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...
随机推荐
- PC电脑端如何多开Skype,一步搞定!
由于工作原因,本人经常会用到Skype来联系客户,目前有两个账号需要同时登录. 但是,Skype默认只能登录一个账号,而且安装的时候也不能自定义安装地址,所以没办法同时登录两个. 有的朋友可能会想到直 ...
- 支持C#的开源免费、新手友好的数据结构与算法入门教程
前言 前段时间完成了C#经典十大排序算法(完结)然后有很多小伙伴问想要系统化的学习数据结构和算法,不知道该怎么入门,有无好的教程推荐的.今天给大家推荐一个支持C#的开源免费.新手友好的数据结构与算法入 ...
- 题解 P9326
前言 数学符号约定 \(n\):任意正整数. \(\#\):从未出现过的小写字母. \(\Sigma\):字符集,这里指小写字母集合. \(S\):最终答案的字符矩阵. 其余符号同题目翻译中所写. 如 ...
- 教你如何使用PyTorch解决多分类问题
本文分享自华为云社区<使用PyTorch解决多分类问题:构建.训练和评估深度学习模型>,作者: 小馒头学Python. 引言 当处理多分类问题时,PyTorch是一种非常有用的深度学习框架 ...
- tableau用数值呈现条形图的总计
创建计算字段 创建计算字段:销售额总计,键入函数: IF Size()=1 THEN 0 ELSE Sum([销售额]) END 创建视图 将度量"销售额"拖放至列,将维度&quo ...
- 如何使用Tampermonkey开发并使用一个浏览器脚本
准备工作 简介 Tampermonkey 是一款强大的浏览器扩展,它允许您定制网页的行为,改变和优化网页的展示方式或者功能以满足个人需求.通过编写自定义脚本,您可以实现许多有趣的功能,从自动化任务到改 ...
- 手把手教你搭建 Ceph+JuiceFS
Ceph 提供了对象存储,可作为存储引擎在 JuiceFS 中使用.这一组合非常适合云计算.大数据分析和机器学习等数据密集型应用场景. 在日常部署中可直接通过 Ceph RADOS 配合 JuiceF ...
- 拖.sql文件到cmd中运行
这个非常简单,但是网上说的又不清楚. 第一步cmd中进入数据库 其操作是 mysql -u root - p 密码: 第二步使用数据库 其操作是use 数据库名字: ...
- [ABC327G] Many Good Tuple Problems
题目链接 简化题意:有一个 \(n\) 个点的图,问有多少个长度为 \(M\) 的边序列,满足连边后图是二分图. \(n\le 30,m\le 10^9\) 考虑先强制要求无重边. 定义 \(f_{i ...
- Head First Java学习:第十一章-异常处理
第十一章 异常处理 1.方法可以抓住其他方法所抛出的异常:异常总是丢回给调用方 有风险.会抛出异常的程序代码: 负责声明异常:创建Exception对象并抛出 调用该方法的程序代码: 在try中调用程 ...