Java監聽器原理及實例


一、監聽器原理

  1. 監聽器是基於事件驅動的,用於對操作事件進行監聽、處理,是觀察者設計模式的應用
  2. 監聽器三元素:

2.1 事件源:事件發生的源頭

2.2 事件:對事件進行抽象、封裝

2.3 監聽器:用於監聽事件源,當事件發生時進行處理

二、監聽器實例:此案例主要圍繞購物車場景操作事件的實現,有一定的實際項目參考性

  1. UML類圖模型
  2. 接口及實現類、場景類定義
  3. package com.wuji;
    
    import java.util.EventListener;
    
    /**
     * event listener handler interface must extends EventListener
     */
    public interface EventListenerHandler extends EventListener {
        void handler(EventInfo eventInfo);
    }

     

    package com.wuji;
    
    /**
     * Event Info operator interface
     */
    public interface EventInfo {
        String getEventType();
    
        Object getEventSource();
    }
  4. package com.wuji;
    
    /**
     * 添加事件監聽器,實現監聽器接口類
     */
    public class AddEventListenerHandler implements EventListenerHandler {
    
        public void handler(EventInfo eventInfo) {
            if(eventInfo==null){
                return;
            }
            if(eventInfo.getEventType().equals("add")){
                System.out.println("添加購物車事件。。。");
            }
    
            EventSource eventSource=(EventSource)eventInfo.getEventSource();
            int productCount=eventSource.getCount();
            System.out.println("購物車中現在有商品:" + productCount + "件");
        }
    }

     

    package com.wuji;
    
    import java.util.EventObject;
    
    public class AddEvent extends EventObject implements EventInfo {
    
        private final String eventType="add";
        public AddEvent(Object source){
            super(source);
        }
        @Override
        public String getEventType() {
            return eventType;
        }
    
        @Override
        public Object getEventSource() {
            return getSource();
        }
    }

     

  5. package com.wuji;
    
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * 事件源:具體為購物輻操作事件源
     */
    public class EventSource {
        private Collection<EventListenerHandler> eventListenerHandlers=null;
        private int count=0;
    
        public int getCount(){
            return count;
        }
    
        public void registryEventListenerHandler(EventListenerHandler eventListenerHandler){
            if(eventListenerHandlers==null){
                eventListenerHandlers=new HashSet<EventListenerHandler>();
                eventListenerHandlers.add(eventListenerHandler);
            }
        }
    
        public void removeEventListenerHandler(EventListenerHandler eventListenerHandler){
            if(eventListenerHandlers!=null){
                eventListenerHandlers.remove(eventListenerHandler);
            }
        }
    
    
       public void addCar(){
            ++count;
            if(eventListenerHandlers!=null){
                EventInfo eventInfo=new AddEvent(this);
                notifies(eventInfo);
            }
           System.out.println("向購物車添加商品成功...");
       }
    
       private void notifies(EventInfo eventInfo){
           Iterator iterator=eventListenerHandlers.iterator();
           while (iterator.hasNext()){
               ((EventListenerHandler)iterator.next()).handler(eventInfo);
           }
       }
    
    }

     

    package com.wuji;
    
    public class Client {
        public static void main(String[] args) {
            EventSource eventSource=new EventSource();
            EventListenerHandler addEventListenerHandler=new AddEventListenerHandler();
            eventSource.registryEventListenerHandler(addEventListenerHandler);
            //eventSource.removeEventListenerHandler(addEventListenerHandler);
            eventSource.addCar();
            eventSource.addCar();
        }
    }

     

三、總結:上面的案例是圍繞購物車操作場景進行事件監聽操作的,主要涉及三個元素即事件源【EventSource】、事件信息接口【EventInfo】、事件監聽處理器接口【EventListenerHandler】,其中事件信息和事件監聽處理器是接口,具體實現為:添加事件信息、添加事件監聽處理器,具體見上面相關代碼。事件監聽處理器傳遞了事件源,可以通過事件源進行操作相關行為。如本例的獲取購物車商品數量。大家可以試着實現購物車的刪除事件並運行查看結果。事件源封裝了事件注冊中心,可以注冊和取消多個具體事件監聽器。

 
       


免責聲明!

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



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