監聽器(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM