监听器(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