概念:
監聽器就是一個實現特定接口的普通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