java事件监听器分为三部分:事件,事件源,监听器。

事件—事件状态对象,也就是发生了什么事件。用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中。(伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。事件状态对象作为单参传递给应响应该事件的监听者方法中。发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。)

事件源—具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener(事件就是事件源中的一个状态)。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener

监听器—对每个明确的事件的发生,都相应地定义一个明确的Java方法

—— 实例:

如果博客可以作为一个事件源,那么修改,新增,删除都是事件,可以这么写。

事件类

接口:

package event.events;

import java.util.EventObject;

public interface EventInfo{
    public String getDoType() ;
}

实现类:

package event.events;

import java.util.EventObject;

public class AddEvent extends EventObject implements EventInfo{
    private final String doType = "add";

    /**
     * Constructs a prototypical Event.
     *
     * @param source The object on which the Event initially occurred.
     * @throws IllegalArgumentException if source is null.
     */
    public AddEvent(Object source) {
        super(source);
    }

    @Override
    public String toString(){
        return doType;
    }

    @Override
    public String getDoType(){
        return doType;
    }
}
package event.events;

import java.util.EventObject;

public class DelEvent extends EventObject implements EventInfo {

    //事件类型
    public final String doType= "delete";

    /**
     * Constructs a prototypical Event.
     *
     * @param source The object on which the Event initially occurred.
     * @throws IllegalArgumentException if source is null.
     */
    public DelEvent(Object source) {
        super(source);
    }

    @Override
    public String toString(){
        return doType;
    }

    @Override
    public String getDoType() {
        return doType;
    }
}
package event.events;

import java.util.EventObject;

public class ModifyEvent extends EventObject implements EventInfo{
    private final String doType = "modify";

    /**
     * Constructs a prototypical Event.
     *
     * @param source The object on which the Event initially occurred.
     * @throws IllegalArgumentException if source is null.
     */
    public ModifyEvent(Object source) {
        super(source);
    }

    @Override
    public String toString(){
        return doType;
    }

    @Override
    public String getDoType() {
        return doType;
    }
}

监听器

接口

package event.eventListener;

import event.events.EventInfo;

import java.util.EventListener;

public interface EventListenerInfo extends EventListener {

    public default void handler(EventInfo eventInfo){
        System.out.println(eventInfo.toString());
    }

}

实现类

package event.eventListener;

import event.events.EventInfo;

public class AddEventListener implements EventListenerInfo{

    @Override
    public void handler(EventInfo object) {
        if(object.getDoType().equals("add"))
            System.out.println("新增文章。。。。");
        //进行后续操作
    }
}
package event.eventListener;

import event.events.EventInfo;

public class DelEventListener implements EventListenerInfo{

    @Override
    public void handler(EventInfo object) {
        if(object.getDoType().equals("delete"))
            System.out.println("删除文章。。。。");
        //进行后续操作
    }
}
package event.eventListener;

import event.events.EventInfo;

public class ModifyEventListener implements EventListenerInfo{

    @Override
    public void handler(EventInfo object) {
        if(object.getDoType().equals("modify"))
            System.out.println("修改文章。。。。");
        //进行后续操作
    }
}

事件源

package event;

import com.sun.org.apache.xpath.internal.SourceTree;
import event.eventListener.EventListenerInfo;
import event.events.AddEvent;
import event.events.DelEvent;
import event.events.EventInfo;
import event.events.ModifyEvent;

import java.util.Collection;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Iterator;

/**
 * 1.事件源--事件发生的地方。如一个map集合,它上面发生的增删查改,就是事件;这个map
 *   就是事件源。
 * 2.这个事件源是一篇博客。
 * 3.我们可以创建多个事件源
 */
public class EventSource
{
    private Collection listeners;

    //给事件源注册监听器
    public void addDoListener(EventListenerInfo eventListener){
        if(listeners==null){
            listeners = new HashSet();
        }
        listeners.add(eventListener);
    }

    //给事件源注销监听器
    public void remvoeDolistener(EventListenerInfo eventListener){
        if(listeners == null){
            return;
        }
        listeners.remove(eventListener);
    }

    //触发删除事件
    public void fireDelEvent(){
        if(listeners==null)
            return;
        EventInfo ei = new DelEvent(this);
        notifies(ei);
    }

    //触发新建事件
    public void fireAddEvent(){
        if(listeners==null)
            return;
        EventInfo ei = new AddEvent(this);
        notifies(ei);
    }

    //触发修改事件
    public void fireModifyEvent(){
        if(listeners==null)
            return;
        EventInfo ei = new ModifyEvent(this);
        notifies(ei);
    }


    //当该事件源上有事件发生时,通知该事件源上的所有的监听器做出相应的反应
    public void notifies(EventInfo eventInfo){
        Iterator it = listeners.iterator();
        while (it.hasNext()){
            ((EventListenerInfo)it.next()).handler( eventInfo);
        }
    }
}

测试

package event;

import event.eventListener.AddEventListener;
import event.eventListener.DelEventListener;
import event.eventListener.ModifyEventListener;
import event.events.AddEvent;

public class Test {

    public static void main(String[] args) {
        EventSource es = new EventSource();      //一个博客事件源
        EventSource es2 = new EventSource();     //另一个博客的事件源

        //给每个事件源增加监听器
        es.addDoListener(new AddEventListener());
        es.addDoListener(new DelEventListener());
        es.addDoListener(new ModifyEventListener());

        es2.addDoListener(new AddEventListener());
        es2.addDoListener(new DelEventListener());
        es2.addDoListener(new ModifyEventListener());

        //事件发生
        es.fireAddEvent();
        es.fireModifyEvent();
        es.fireDelEvent();

        es2.fireAddEvent();
        es2.fireModifyEvent();
        es2.fireDelEvent();
    }
}

后记:其实可以把三个事件类放到一个类里面,用一个变量分别代表三种状态(新增,修改,删除),在EventListener中也可以放在同一个类中,可以根据事件的状态,进行不同的处理。这样做的可以随时根据当前状态判断发生的是什么事件。