首页 > 技术文章 > Java监听器原理及实例

javajiuyangzhenjing 2019-02-16 21:31 原文

一、监听器原理

  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】,其中事件信息和事件监听处理器是接口,具体实现为:添加事件信息、添加事件监听处理器,具体见上面相关代码。事件监听处理器传递了事件源,可以通过事件源进行操作相关行为。如本例的获取购物车商品数量。大家可以试着实现购物车的删除事件并运行查看结果。事件源封装了事件注册中心,可以注册和取消多个具体事件监听器。


推荐阅读