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默认只能登录一个账号,而且安装的时候也不能自定义安装地址,所以没办法同时登录两个. 有的朋友可能会想到直 ...
- 论文精读:用于少样本目标检测的元调整损失函数和数据增强(Meta-tuning Loss Functions and Data Augmentation for Few-shot Object Detection)
论文链接:Meta-Tuning Loss Functions and Data Augmentation for Few-Shot Object Detection Abstract 现阶段的少样本 ...
- uni-app框架开发app发布流程
uni-app框架开发app发布流程 1.首先公司申请软著 步骤:申请软著详细流程 - 阿长*长 - 博客园 (cnblogs.com) 一.安卓端 1,点击发行>原生-app云打包 正式包和自 ...
- Modbus 转PROFIBUS DP网关在工厂自动温度控制系统中的应用案例
Modbus 转PROFIBUS DP 网关PM-160 在工厂自动温度控制系统中的应用案例 摘要 随着科技的发展和工业生产水平的提高,自动温度控制系统在纺织.化工.机械等各类工业控制过程中得到了广泛 ...
- JavaWeb项目练习(学生选课管理系统)二【新建数据库】
思路 1.页面美化css这部分,挖个坑,我打算做好一点所以先空着.× 2.需要做四个数据表(学生.教师.管理员.课程) 关联: 学生有个人课表 教师有教授课程和个人课表 管理员有全部权限(关联所有数据 ...
- bash shell笔记整理——cd命令、目录路径
cd---change directory 改变目录的意思 语法: cd [选项] <目录> 选项: -L 会自动进入符号连接目录(默认) -P 进入符号连接目录的真实目录下. 常用: 命 ...
- selenium之内联框架和多窗口切换
内联框架frame frame是一种内联框架,用于在html里面内部嵌入子页面(完整的html),对于这种元素,内部子页面的内容selenium无法直接控制,必须通过 switch_to跳转到对应的f ...
- Linux应急响应总结——更新中
Linux应急响应 用户信息 方向 查看可登录的用户: cat /etc/passwd | grep /bin/bash awk -F: '{if($7!="/usr/sbin/nologi ...
- 2023河南省第五届“金盾信安杯”CRYPTO MISC 复现
MISC 来都来了 题目 我的解答: 给了一个加密压缩包,010查看发现是伪加密,修改如下两部分: 头部和尾部的09分别改为00 然后解压得到: 尝试base64解码得到很零散的结果..大眼一看不知道 ...
- Docker 部署工具
Docker 容器的创建比较简单,容器解决了应用程序对于运行环境的依赖问题,但是在当前所处的微服务盛行的情况下,手动管理容器是一件比较重复其及其枯燥的工作,这项工作理论上可以通过计算机来完成,因此涌现 ...