目录
一、java事件3大组成要素
1.EventObject:事件状态对象,一般自定义事件对象来继承该父对象
2.EventSource:事件源,比如一个点击事件,一个数据修改变动等等均可以作为事件源
3.EventListener:事件监听器,对于发生的事件,我们可能需要采取相应的操作,这个时候就需要使用监听者来实现。EventListener是一个接口,具体从操作实现方法可以实现该接口。
伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。
事件状态对象作为单参传递给应响应该事件的监听者方法中。发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。
具体的对监听的事件类,当它监听到event object产生的时候,它就调用相应的方法,进行处理。
二、代码样例
本样例场景如下:有一个车辆所有者,他有两辆汽车,一辆奔驰,一辆宝马。某些时候,他会下发指令,说前进,后退,宝马和奔驰车要根据他的指令执行相应的动作。
2.1 定义事件对象(车状态):
package com.multithread.learn.eventListener;
import java.util.EventObject;
/**
* 定义一个事件的对象,继承EventObject;
*/
public class CarEvent extends EventObject {
private static final long serialVersionUID = 1L;
// 汽车的状态
private String carStatue = "";
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public CarEvent(Object source,String carStatue) {
super(source);
this.carStatue = carStatue;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getCarStatue() {
return carStatue;
}
public void setCarStatue(String carStatue) {
this.carStatue = carStatue;
}
}
2.2 定义事件监听者(观察者)
a.先定义一个监听器接口
package com.multithread.learn.eventListener;
import java.util.EventListener;
/**
* 定义监听接口,负责监听CarEvent事件,在监听到事件以后执行具体的操作
*/
public interface CarListener extends EventListener {
void carEvent(CarEvent event);
}
b.定义好两个实现
package com.multithread.learn.eventListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@Slf4j
public class CarListener1 implements CarListener {
@Override
public void carEvent(CarEvent event) {
if(StringUtils.isNotEmpty(event.getCarStatue())){
switch (event.getCarStatue()){
case "open":
log.info("奔驰车门已打开");
break;
case "d":
log.info("奔驰前进");
break;
case "p":
log.info("奔驰停车");
break;
case "r":
log.info("奔驰倒车");
break;
case "s":
log.info("奔驰运动模式");
break;
default:
log.info("奔驰未知状态");
break;
}
}
}
}
package com.multithread.learn.eventListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@Slf4j
public class CarListener2 implements CarListener {
@Override
public void carEvent(CarEvent event) {
if(StringUtils.isNotEmpty(event.getCarStatue())){
switch (event.getCarStatue()){
case "open":
log.info("宝马车门已打开");
break;
case "d":
log.info("宝马前进");
break;
case "p":
log.info("宝马停车");
break;
case "r":
log.info("宝马倒车");
break;
case "s":
log.info("宝马运动模式");
break;
default:
log.info("宝马未知状态");
break;
}
}
}
}
2.3 定义一个管理者(被观察者)
package com.multithread.learn.eventListener;
import java.util.HashSet;
import java.util.Set;
/**
* 事件源对象,在这里你可以把它想象成一个控制车的挡位。
* (如果是在swing中,就类似一个button)
*/
public class CarManager {
private Set<CarListener> set = new HashSet<>();
/**
* 添加事件
*/
public void addCarListener(CarListener carListener){
set.add(carListener);
}
/**
* 移除监听事件
*/
public void removeCarListener(CarListener carListener){
set.remove(carListener);
}
/**
* 触发开车事件
*/
protected void dCar(){
CarEvent carEvent = new CarEvent(this,"d");
this.notifyListeners(carEvent);
System.out.println("开车事件");
}
/**
* 触发倒车事件
*/
protected void rCar(){
CarEvent carEvent = new CarEvent(this,"r");
this.notifyListeners(carEvent);
System.out.println("倒车事件");
}
/**
* 通知所有监听器执行
* @param carEvent
*/
private void notifyListeners(CarEvent carEvent){
if(!set.isEmpty()){
for(CarListener item : set){
item.carEvent(carEvent);
}
}
}
}
2.4定义测试类:
package com.multithread.learn.eventListener;
public class MainTest {
public static void main(String[] args) {
CarManager manager = new CarManager();
manager.addCarListener(new CarListener1());
manager.addCarListener(new CarListener2());
System.out.println("开始");
manager.dCar();
System.out.println("开了一段距离");
manager.rCar();
System.out.println("倒车完成");
}
}
2.5 运行结果:
开始
12:01:06.187 [main] INFO com.multithread.learn.eventListener.CarListener1 - 奔驰前进
12:01:06.191 [main] INFO com.multithread.learn.eventListener.CarListener2 - 宝马前进
开车事件
开了一段距离
12:01:06.192 [main] INFO com.multithread.learn.eventListener.CarListener1 - 奔驰倒车
12:01:06.192 [main] INFO com.multithread.learn.eventListener.CarListener2 - 宝马倒车
倒车事件
倒车完成