码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-05-01 15:22:39      阅读:383      评论:0      收藏:0      [点我收藏+]

标签:完整   obs   over   setw   color   流程   效果   and   void   

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

a)事件三要素:

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

 

b)事件流转过程:

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

 

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

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

public class Event implements Serializable {

    private Object source;
    
    private Date when;
    
    private String message;
    
    public Object getSource() {
        return source;
    }

    public void setSource(Object source) {
        this.source = source;
    }
    
    public Date getWhen() {
        return when;
    }

    public void setWhen(Date when) {
        this.when = when;
    }
    
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

 

监听器接口:EventListener

public interface EventListener {

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

 

监听器实现:MyListener

public class MyListener implements EventListener {

    private Log log = LogFactory.getLog(getClass());

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    @Override
    public void handleEvent(Event event) {
        log.info("source: " + event.getSource() + ", message: " + event.getMessage() + ", when: "
                + sdf.format(event.getWhen()));
    }

}

 

为了规范化,我们在这里制定一个事件源接口:EventSource

public interface EventSource {

    /**
     * 增加监听器
     * @param listener
     */
    void addListener(EventListener listener);
    
    /**
     * 通知监听器
     */
    void notifyListeners();
}

 

编写测试的事件源: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 notifyListeners() {
        for (EventListener listener : listeners) {
            Event event = new Event();
            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();
    }

    public static void main(String[] args) {
        MySource source = new MySource();
        source.addListener(new MyListener());
        source.setValue(100);
    }
}

 

测试输出:

[INFO]-[MyListener-handleEvent(16)]: source: com.lichmama.event.MySource@2019a9d1, message: setValue 100, when: 2018-05-01 01:18:35

 

*PS:是不是觉得这个跟观察者设计模式很像,没错。就效果而言,事件监听器模式和观察者模式并没有什么区别,不过在事件模型的设置上有些许差别。在观察者模式中并没有Event这个角色,或者说它被合并到Observable角色中了,即整合了事件源与事件。

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

标签:完整   obs   over   setw   color   流程   效果   and   void   

原文地址:https://www.cnblogs.com/lichmama/p/8976092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!