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

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());
}
}

监听器接口: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角色中了,即整合了事件源与事件。

最新文章

  1. [转]socket 通俗解释
  2. linux升级openssh
  3. flask笔记3-模板
  4. 初识Web 服务(即Web Service)
  5. shell简单使用
  6. php上传文件进度条
  7. NOIP欢乐模拟赛 T1 解题报告
  8. javax.servlet.ServletException: com.ibatis.sqlmap.client.SqlMapException: There is no statement named...问题
  9. devexpress13学习系列(三)PDFViewer(3)
  10. Poj(3686),最小权匹配,多重匹配,KM
  11. Tomcat配置HTTPS方式生成安全证书
  12. android开发的学习路线
  13. 第八讲:I/O虚拟化
  14. [NOIP复习]第三章:动态规划
  15. R语言数据框中,用0替代NA缺失值
  16. IIR滤波器软件实现(Matlab+C++)
  17. git 本地项目推到远程仓库
  18. 从零开始学Shell(二)
  19. redis、mysql、mongdb的比较
  20. nodejs基础学习1

热门文章

  1. 关于Mysql datetime类型存储范围测试
  2. 【转载】如何删除Windows远程桌面保存的账号密码数据
  3. UIDatePicker基本使用
  4. Python 字符串常用函数
  5. SAP技术 - How to create a CDS redirect view for a given database table
  6. git https解决免ssL和保存密码
  7. Idea 热部署插件JRebel 安装与环境配置-上海尚学堂Java培训
  8. (六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet
  9. jenkins部署java项目(五)
  10. Dapper: How to get return value ( output value) by call stored procedure