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

    
    
  • 相关阅读:
    Redis分布式锁的正确加锁与解锁方式
    高并发系统中的限流算法
    谈谈 InnoDB引擎中的一些索引策略
    面试必问:手写一个内存泄漏的程序
    空指针异常与Optional类
    Redis的内存淘汰策略
    explain的关键字段的意义
    pycharm编辑器简单配置-- 持续更新完善
    vscode 插件-better comments-代码注释高亮
    阿里前端开发规范-转载
  • 原文地址:https://www.cnblogs.com/javajiuyangzhenjing/p/10389348.html
Copyright © 2020-2023  润新知