• Java实现一个简单的事件监听器


    关于事件监听我们需要知道的一些基础知识。

    a)事件三要素(who when what):

    source     --    事件源
    when       --    事件发生时间
    message    --    事件主题消息,即希望通过事件传递出去的信息

     b)事件模型的构成:

    event     --     事件
    source    --     事件源
    listener  --     事件监听器    

    c)事件流转过程:

    (1)事件源注册监听器 -> (2)事件发生 -> (3)通知监听器 -> (4)监听器处理

    那么基于以上背景知识,我们来是实现一个简单的监听器,并测试一下事件监听的完整流程。

    根据事件三要素设计出一个简单合理的事件载体:Event

    public interface Event extends Serializable {
    
        Object getSource();
    
        Date getWhen();
    
        String getMessage();
    
        /**
         * 事件回调方法
         */
        void callback();
    }

    事件实现:MyEvent

    public class MyEvent implements Event {
    
        private Log log = LogFactory.getLog(getClass());
    
        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
        private Object source;
    
        private Date when;
    
        private String message;
    
        @Override
        public Object getSource() {
            return source;
        }
    
        public void setSource(Object source) {
            this.source = source;
        }
    
        @Override
        public Date getWhen() {
            return when;
        }
    
        public void setWhen(Date when) {
            this.when = when;
        }
    
        @Override
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        @Override
        public void callback() {
            log.info(toString());
        }
    
        @Override
        public String toString() {
            return "source: " + getSource() + ", message: " + getMessage() + ", when: " + sdf.format(getWhen());
        }
    }
    View Code

    监听器接口:EventListener

    public interface EventListener {
    
        /**
         * 事件触发
         * @param event
         */
        void handleEvent(Event event);
    }

    监听器实现:MyListener

    public class MyListener implements EventListener {
    
        @Override
        public void handleEvent(Event event) {
            event.callback();
        }
    }

    事件源接口:EventSource

    public interface EventSource {
    
        /**
         * 增加监听器
         * @param listener
         */
        void addListener(EventListener listener);
        
        /**
         * 通知监听器
         */
        void notifyListener();
    }

    编写测试的事件源:MySource

    public class MySource implements EventSource {
        
        private List<EventListener> listeners = new ArrayList<EventListener>();
    
        private int value;
    
        @Override
        public void addListener(EventListener listener) {
            listeners.add(listener);
        }
    
        @Override
        public void notifyListener() {
            for (EventListener listener : listeners) {
                MyEvent event = new MyEvent();
                event.setSource(this);
                event.setWhen(new Date());
                event.setMessage("setValue " + value);
                listener.handleEvent(event);
            }
        }
        
        public int getValue() {
            return value;
        }
    
        public void setValue(int value) {
            this.value = value;
            notifyListener();
        }
    
        @Test
        public void testEventListener() {
            MySource source = new MySource();
            source.addListener(new MyListener());
            source.setValue(100);
        }
    }

    测试输出:

    [INFO]-[Event-callback(50)]: source: com.lichmama.test.listen.MySource@119126ab, message: setValue 100, when: 2018-05-01 02:52:13

    *PS:监听器模式和观察者模式看起来很像,不过在事件模型的设置上有些许差别。在观察者模式中并没有Event这个角色,或者说它被合并到Observable角色中了,即整合了事件源与事件。

  • 相关阅读:
    索引
    IComparer 与 IComparable
    foreach
    修正needle在摘要认证时第二次请求仍返回401错误
    js笔记
    Ntp客户端
    c# 笔记
    android笔记
    nodejs笔记
    js 常用基本知识
  • 原文地址:https://www.cnblogs.com/lichmama/p/8976092.html
Copyright © 2020-2023  润新知