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

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角色中了,即整合了事件源与事件。

Java实现一个简单的事件监听器的更多相关文章

  1. 使用lua实现一个简单的事件派发器

    设计一个简单的事件派发器,个人觉得最重要的一点就是如何保证事件派发过程中,添加或删除同类事件,不影响事件迭代顺序和结果,只要解决这一点,其它都好办. 为了使用pairs遍历函数,重写了pairs(lu ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. 使用 java 实现一个简单的 markdown 语法解析器

    1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...

  4. java:jsp: 一个简单的自定义标签 tld

    java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...

  5. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  6. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

  7. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  8. 利用java实现一个简单的远程监控程序

    一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端, ...

  9. 【转】转帖并注释:Java中的事件处理机制--事件监听器的四种实现方式

    原文地址:http://blog.sina.com.cn/s/blog_4b650d650100nqws.html Java中四种事件监听器的实现方式分别为: 自身类做为事件监听器 外部类作为事件监听 ...

随机推荐

  1. javascript Class.method vs Class.prototype.method(类方法和对象方法)

    在stackoverflow上看到一个这样的提问,以下代码有什么区别? Class.method = function () { /* code */ } Class.prototype.method ...

  2. Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...

  3. Java自学-面向对象 属性

    Java类的属性 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 步骤 1 : 属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以是类类型,比如Strin ...

  4. npm err! Unexpected end of JSON input while parsing near解决办法

    npm install时出现npm err! Unexpected end of JSON input while parsing near错误 输入  npm cache clean --fore ...

  5. $parsers & $formatters

    一.理解 $parsers 和 $formatters Angular 是MVVM框架,model层数据变化了会通知view层更新,同样的view层更新了也会通知到model $parsers 和 $ ...

  6. JavaScript之变量(声明、解析、作用域)

    声明(创建) JavaScript 变量 在 JavaScript 中创建变量通常称为"声明"变量. 一.我们使用 var 关键词来声明变量: var carname; 变量声明之 ...

  7. Vue学习之路由vue-router小结(九)

    一.路由: 1.后端路由: 对于普通网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 2.前端路由: 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页 ...

  8. Spring Data JPA的低级错误

    //课程表 @Entity public class Class { @GeneratedValue(strategy = GenerationType.AUTO) @Id private Long ...

  9. 给任意view设置圆角outline.setRoundRect()方法实现

    效果图,给banner设置圆角,1没有直接修改imageView而是使用自带方法进行设置 具体方法如下 //圆角方法 @TargetApi(Build.VERSION_CODES.LOLLIPOP) ...

  10. H3C 802.11 WEP加密特点与注意事项