美文网首页
监听者模式

监听者模式

作者: 码而优则仕 | 来源:发表于2020-06-30 20:58 被阅读0次

    监听者模式

    回调函数:

    • 往组件注册自定义的方法,以便组件在特定场景下调用—这个方法是组件定义的,业务方实现

      @Slf4j
      public class CallBackDemo {
      
          public static void main(String args[]) {
              Thread thread = new Thread(new Runnable() {
      
                  @Override
                  public void run() {
                      try {
                          System.out.println("准备休息了");
                          Thread.sleep(2000);
                      } catch (Exception e) {
                          log.error("线程休眠异常", e);
                      }
                      System.out.println("休息结束了");
                      System.out.println("线程被回调了");
                  }
              });
              thread.start();
          }
      }
      

      以上就是一个回调函数,Thread 类就是上面所说的组件,Runnable 接口中定义的 run 方法就是自定义方法(回调函数),我们不希望直接调用 run方法直接执行,而是让 Thread 组件在特殊时刻去执行。该时刻就是在调用 start方法之后再执行,主线程调用 start 方法后会生成一个子线程,子线程会在某个时刻执行自己run方法的时候调用 Runnable接口中实现的 run方法。

    事件监听器

    监听器将监听自己感兴趣的事件,一旦事件发生,就会做出响应。

    事件监听器涉及三个组件:

    • 事件源(Event Source)

      要想使事件源对某些事件进行响应,就需要在事件源上注册特定的监听器

      如按钮

    • 监听器(Event Listener)

      监听器要注册在事件源上才会被调用,主要用来监听事件,并进行事件的处理和转发

      监听到类似按钮被按这样的事件源

    • 事件对象(Event Object)

      主要负责事件源,和事件监听器之间的信息的传递

    使用事件监听器模式可以节约代码,事件监听器事件源 是可以分开开发的。事件监听器事件源 之间使用 事件 进行联系

    事件监听器 和 事件源,不用关心彼此实现。

    事件监听器就是设计模式中 观察者模式 的实现

    事件源,事件—观察者模式中的 主题组件

    事件监听器—观察者模式中的 观察者

    具体代码实现:

    事件:

    /**
     * @author wsq
     * @version Event.java  2020/6/30  上午8:29 下午
     * 事件对象--在事件源和事件监听器之间传递信息
     */
    @Data
    public class Event {
    
        private String type;
    }
    

    事件监听器接口定义:

    /**
     * @author wsq
     * @version EventListener.java  2020/6/30  上午8:31 下午
     * 监听器接口,具体监听器需要实现这个接口
     */
    public interface EventListener {
    
        void processEvent(Event event);
    
    }
    

    具体事件监听器

    /**
     * @author wsq
     * @version SingleClickEventListener.java  2020/6/30  上午8:33 下午
     * 单击监听器接口
     */
    public class SingleClickEventListener implements EventListener {
    
        @Override
        public void processEvent(Event event) {
            if ("singleClick".equals(event.getType())) {
                System.out.println("单击被触发");
            }
        }
    }
    
    /**
     * @author wsq
     * @version DoubleClickEventListener.java  2020/6/30  上午8:37 下午
     * 双击监听器接口
     */
    public class DoubleClickEventListener implements EventListener {
    
    
        @Override
        public void processEvent(Event event) {
            if ("doubleClick".equals(event.getType())) {
                System.out.println("双击被触发");
            }
        }
    }
    

    事件源:

    /**
     * @author wsq
     * @version EventSource.java  2020/6/30  上午8:36 下午
     * 事件源 -- 事件监听器 需要注册到事件源上,事件源有多个 使用 List 接收
     * 对外提供事件监听器注册接口
     * 发布事件
     */
    public class EventSource {
    
        private List<EventListener> listeners = new ArrayList<>();
    
        /**
         * 对外暴露 注册 事件监听器的 口子
         *
         * @param listener
         */
        public void register(EventListener listener) {
            listeners.add(listener);
        }
    
        /**
         * 事件源发布事件
         *
         * @param event 事件源
         */
        public void publishEvent(Event event) {
            //对 注册到 事件源 的 不同事件监听器 都发布事件
            //由事件监听器决定是否响应事件 -- 即事件源发布的事件 是否是自己感兴趣的事件,是就做出响应,否则忽略
            for (EventListener listener : listeners) {
                listener.processEvent(event);
            }
        }
    
    
    }
    

    程序入口:

    public class EventModeDemo {
    
        public static void main(String args[]) {
            EventSource source = new EventSource();
            SingleClickEventListener singleClickEventListener = new SingleClickEventListener();
            DoubleClickEventListener doubleClickEventListener = new DoubleClickEventListener();
            //往 事件源 注册不同的 事件监听器
            source.register(singleClickEventListener);
            source.register(doubleClickEventListener);
            // 对所有事件监听器 广播发布单击事件
            Event singleClickEvent = new Event();
            singleClickEvent.setType("singleClick");
            source.publishEvent(singleClickEvent);
        }
    }
    

    输出:

    单击被触发

    Process finished with exit code 0

    相关文章

      网友评论

          本文标题:监听者模式

          本文链接:https://www.haomeiwen.com/subject/bkjfqktx.html