监听器(Listener)详解及举例

概念:

  监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

监听器组成要素:

  事件源:事件发生的源头,属于被监听的对象。例如一个开关

  事件对象:被用来包装事件源,比如开关打开、关闭事件。

  监听器:定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。

监听器原理:

 

 

 

 

实现简单监听器:

/**
 * 事件源对象
 */
public class EventSource {

    private List<EventListener> listeventListeners = new ArrayList<>();

    /**
     * 注册监听器
     * @param eventListener
     */
    public void registerEventListener(EventListener eventListener){
        listeventListeners.add(eventListener);
    }

    /**
     * 销毁监听器
     * @param eventListener
     */
    public void destroyEvnetListener(EventListener eventListener){
        listeventListeners.remove(eventListener);
    }

    /**
     * 通知所有的监听器监听此事件对象
     * @param eventObject
     */
    public void notifyListener(EventObject eventObject){
        listeventListeners.forEach(eventListener -> {
            eventListener.handleEvent(eventObject);
        });
    }

    /**
     * 事件源产生open事件对象
     */
    public void open(){
        EventObject eventObject = new EventObject("open");
        notifyListener(eventObject);
    }

    /**
     * 事件源产生close事件对象
     */
    public void close(){
        EventObject eventObject = new EventObject("close");
        notifyListener(eventObject);
    }
}

 

/**
 * 监听器接口
 */
public interface EventListener extends java.util.EventListener {

    /**
     * 事件处理器
     * @param eventObject
     */
    void handleEvent(EventObject eventObject);

}

 

/**
 * 监听器接口实现类处理事件逻辑
 */
public class EventListenerImpl implements EventListener {
    @Override
    public void handleEvent(EventObject eventObject) {

        eventObject.doEvent();
        if (eventObject.getSource().equals("open")) {
            //当事件是open时业务逻辑
            System.out.println("监听器执行方法:open....");
        }

        if (eventObject.getSource().equals("close")) {
            //当事件时close时业务逻辑
            System.out.println("监听器执行方法:close....");
        }
    }
}

 

/**
 * 事件对象
 */
public class EventObject extends java.util.EventObject {

    public EventObject(Object source) {
        super(source);
    }

    public void doEvent(){
        System.out.println("事件源产生的事件对象:"+this.getSource());
    }
}

 

/**
 * 启动类
 */
public class TestListener {
    public static void main(String[] args) {
        //创建事件源对象
        EventSource eventSource = new EventSource();
        //创建监听器对象
        EventListener eventListener1 = new EventListenerImpl();
        EventListener eventListener2 = new EventListenerImpl();
        //将监听器对象注册进事件源对象
        eventSource.registerEventListener(eventListener1);
        eventSource.registerEventListener(eventListener2);
        //操作事件源产生事件
        eventSource.open();
        //销毁一个监听器
        eventSource.destroyEvnetListener(eventListener1);
        //操作事件源产生close事件
        eventSource.close();
    }

 

 

运行结果:

事件源产生的事件对象:open
监听器执行方法:open....
事件源产生的事件对象:open
监听器执行方法:open....
事件源产生的事件对象:close
监听器执行方法:close....

Process finished with exit code 0

 

posted @ 2020-07-24 15:17  卯仙  阅读(1453)  评论(0编辑  收藏  举报