概念:
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
监听器组成要素:
事件源:事件发生的源头,属于被监听的对象。例如一个开关
事件对象:被用来包装事件源,比如开关打开、关闭事件。
监听器:定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。
监听器原理:
实现简单监听器:
/**
* 事件源对象
*/
public class EventSource {
private List
/**
* 注册监听器
* @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