概念:

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

监听器组成要素:

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

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

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

监听器原理:

实现简单监听器:

/**

* 事件源对象

*/

public class EventSource {

private List 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