java事件监听处理机制

目录

java事件监听处理机制

一、java事件3大组成要素

二、代码样例

2.1 定义事件对象(车状态):

2.2 定义事件监听者(观察者)

2.3 定义一个管理者(被观察者)

2.4定义测试类:


一、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 - 宝马倒车
倒车事件
倒车完成

猜你喜欢

转载自blog.csdn.net/qq_37488998/article/details/111523719