关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
http://blog.csdn.net/5iasp/article/details/37054171
文章标题:关于JAVA中事件分发和监听机制实现的代码实例
文章地址: http://blog.csdn.net/5iasp/article/details/37054171
作者: javaboy2012
Email:yanek@163.com
qq: 1046011462
一、场景假设
假设有博客系统中需要实现如下功能:
系统中用户发布文章,修改文章,删除文章时,需要一些相关的操作需要执行。
发布文章后,给好友发送邮件通知,给用户加积分,对文章做全文索引。
修改文章后,给好友发送邮件修改通知,给用户加积分,对文章重新做全文索引。
删除文章后,给好友发送邮件修改通知,给用户减少积分,对文章重新做全文索引。
二、相关的概念解析
分析如上场景,可以采用事件分发和监听机制来实现。
事件分发和监听有如下几个概念:
事件源:触发事件的对象 如上场景中我们把实体对象作为事件源,发布的文章就是事件源
事件: 对事件源的操作产生事件,例如 发表文章 修改文章,删除文章这些操作就会触发相关的 文章被发表事件,文章被删除事件,文章被修改事件
事件监听器:对事件源各种事件触发执行行为的抽象,包括接口和若干实现类。
比如: 接口需要定义事件源相关事件触发时需要实现的操作接口。
事件分发器:事件分发器主要处理事件的分发和事件监听器的管理,注册和删除事件监听器等。
三、 代码示例
项目结构:
根据上述概念相关代码如下:
包括如下代码
1. 博客文章类 属于事件源
- package com.yanek.event;
- /**
- * 博客文章
- * @author Administrator
- *
- */
- public class Entry {
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- private long id; // 编号
- private String name; //标题
- }
package com.yanek.event;
/**
* 博客文章
* @author Administrator
*
*/
public class Entry { public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private long id; // 编号
private String name; //标题 }
2. 博客文章事件类 属于事件对象
其中定义了事件的类型和事件源,事件参数
- package com.yanek.event;
- import java.util.Collections;
- import java.util.Date;
- import java.util.Map;
- /**
- * 博客文章事件
- * @author Administrator
- *
- */
- public class EntryEvent
- {
- public static final int ENTRY_ADDED = 100; //事件类型:博客文章被创建
- public static final int ENTRY_DELETED = 101;//事件类型:博客文章被删除
- public static final int ENTRY_MODIFIED = 102;//事件类型:博客文章被修改
- private int eventType; //事件类型
- private Entry entry; //博客文章对象
- private Date date; //事件触发日期
- private Map params; //事件辅助参数
- public EntryEvent(int eventType, Entry entry, Map params) {
- this.eventType = eventType;
- this.entry = entry;
- this.params = params != null ? Collections.unmodifiableMap(params)
- : null;
- date = new Date();
- }
- public int getEventType() {
- return eventType;
- }
- public Entry getEntry() {
- return entry;
- }
- public Map getParams() {
- return params;
- }
- public Date getDate() {
- return date;
- }
- }
package com.yanek.event; import java.util.Collections;
import java.util.Date;
import java.util.Map;
/**
* 博客文章事件
* @author Administrator
*
*/
public class EntryEvent { public static final int ENTRY_ADDED = 100; //事件类型:博客文章被创建
public static final int ENTRY_DELETED = 101;//事件类型:博客文章被删除
public static final int ENTRY_MODIFIED = 102;//事件类型:博客文章被修改 private int eventType; //事件类型
private Entry entry; //博客文章对象
private Date date; //事件触发日期
private Map params; //事件辅助参数 public EntryEvent(int eventType, Entry entry, Map params) {
this.eventType = eventType;
this.entry = entry;
this.params = params != null ? Collections.unmodifiableMap(params)
: null;
date = new Date();
} public int getEventType() {
return eventType;
} public Entry getEntry() {
return entry;
} public Map getParams() {
return params;
} public Date getDate() {
return date;
}
}
3. 事件监听器接口和实现类:
定义各种事件发生时需要处理的接口方法
- package com.yanek.event;
- /**
- * 博客文章监听器接口
- * @author Administrator
- *
- */
- public interface EntryListener
- {
- /**
- * 博客文章被创建
- * @param entryevent
- */
- public abstract void entryAdded(EntryEvent entryevent);
- /**
- * 博客文章被删除
- * @param entryevent
- */
- public abstract void entryDeleted(EntryEvent entryevent);
- /**
- * 博客文章被修改
- * @param entryevent
- */
- public abstract void entryModified(EntryEvent entryevent);
- }
package com.yanek.event;
/**
* 博客文章监听器接口
* @author Administrator
*
*/
public interface EntryListener
{
/**
* 博客文章被创建
* @param entryevent
*/
public abstract void entryAdded(EntryEvent entryevent); /**
* 博客文章被删除
* @param entryevent
*/ public abstract void entryDeleted(EntryEvent entryevent); /**
* 博客文章被修改
* @param entryevent
*/
public abstract void entryModified(EntryEvent entryevent); }
事件监听器接口的实现类:
实现场景中的三类操作,监听器接口实现包括如下三个类实现
IndexManager 索引管理器类
ScoreManager 积分管理器类
EmailManager 邮件管理器类
三个类都实现监听器接口EntryListener。具体代码如下:
- package com.yanek.event;
- /**
- * 邮件管理器
- * @author Administrator
- *
- */
- public class EmailManager implements EntryListener{
- @Override
- public void entryAdded(EntryEvent entryevent) {
- System.out.println("EmailManager 处理 博客文章被创建事件。");
- }
- @Override
- public void entryDeleted(EntryEvent entryevent) {
- System.out.println("EmailManager 处理 博客文章被删除事件。");
- }
- @Override
- public void entryModified(EntryEvent entryevent) {
- System.out.println("EmailManager 处理 博客文章被修改事件。");
- }
- }
- package com.yanek.event;
- /**
- * 索引管理器
- * @author Administrator
- *
- */
- public class IndexManager implements EntryListener {
- @Override
- public void entryAdded(EntryEvent entryevent) {
- System.out.println("IndexManager 处理 博客文章被创建事件。");
- }
- @Override
- public void entryDeleted(EntryEvent entryevent) {
- // TODO Auto-generated method stub
- System.out.println("IndexManager 处理 博客文章被删除事件。");
- }
- @Override
- public void entryModified(EntryEvent entryevent) {
- // TODO Auto-generated method stub
- System.out.println("IndexManager 处理 博客文章被修改事件。");
- }
- }
- package com.yanek.event;
- /**
- * 积分管理器
- * @author Administrator
- *
- */
- public class ScoreManager implements EntryListener {
- @Override
- public void entryAdded(EntryEvent entryevent) {
- System.out.println("ScoreManager 处理 博客文章被创建事件。");
- }
- @Override
- public void entryDeleted(EntryEvent entryevent) {
- // TODO Auto-generated method stub
- System.out.println("ScoreManager 处理 博客文章被删除事件。");
- }
- @Override
- public void entryModified(EntryEvent entryevent) {
- // TODO Auto-generated method stub
- System.out.println("ScoreManager 处理 博客文章被修改事件。");
- }
- }
package com.yanek.event; /**
* 邮件管理器
* @author Administrator
*
*/
public class EmailManager implements EntryListener{ @Override
public void entryAdded(EntryEvent entryevent) { System.out.println("EmailManager 处理 博客文章被创建事件。"); } @Override
public void entryDeleted(EntryEvent entryevent) { System.out.println("EmailManager 处理 博客文章被删除事件。");
}
@Override
public void entryModified(EntryEvent entryevent) { System.out.println("EmailManager 处理 博客文章被修改事件。"); } } package com.yanek.event;
/**
* 索引管理器
* @author Administrator
*
*/
public class IndexManager implements EntryListener { @Override
public void entryAdded(EntryEvent entryevent) { System.out.println("IndexManager 处理 博客文章被创建事件。"); } @Override
public void entryDeleted(EntryEvent entryevent) {
// TODO Auto-generated method stub
System.out.println("IndexManager 处理 博客文章被删除事件。"); } @Override
public void entryModified(EntryEvent entryevent) {
// TODO Auto-generated method stub
System.out.println("IndexManager 处理 博客文章被修改事件。");
} } package com.yanek.event;
/**
* 积分管理器
* @author Administrator
*
*/
public class ScoreManager implements EntryListener { @Override
public void entryAdded(EntryEvent entryevent) {
System.out.println("ScoreManager 处理 博客文章被创建事件。"); } @Override
public void entryDeleted(EntryEvent entryevent) {
// TODO Auto-generated method stub
System.out.println("ScoreManager 处理 博客文章被删除事件。");
} @Override
public void entryModified(EntryEvent entryevent) {
// TODO Auto-generated method stub System.out.println("ScoreManager 处理 博客文章被修改事件。"); } }
4. 博客文章事件分发器类
- package com.yanek.event;
- import java.util.ArrayList;
- /**
- * 博客文章事件分发器
- * @author Administrator
- *
- */
- public class EntryEventDispatcher {
- private static EntryEventDispatcher instance = new EntryEventDispatcher();
- private ArrayList listeners=new ArrayList();
- public static EntryEventDispatcher getInstance() {
- return instance;
- }
- private EntryEventDispatcher() {
- String[] observers = PropertyMgr.getProperty("observers").split(",");
- for(String s : observers) {
- System.out.println(s);
- try {
- this.addListener((EntryListener)(Class.forName(s).newInstance()));
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
- public synchronized void addListener(EntryListener listener) {
- System.out.println(":"+listener);
- if (listener == null) {
- System.out.println(":"+listener);
- throw new NullPointerException();
- } else {
- listeners.add(listener);
- return;
- }
- }
- public synchronized void removeListener(EntryListener listener) {
- listeners.remove(listener);
- }
- public void dispatchEvent(EntryEvent event) {
- // System.out.println("msgDispatchEvent");
- int eventType = event.getEventType();
- long t1=System.currentTimeMillis();
- System.out.println("kaishi="+t1);
- for (int i = 0; i < listeners.size(); i++) {
- try {
- EntryListener listener = (EntryListener) listeners.get(i);
- String name = listener.getClass().getName();
- name = name.substring(name.lastIndexOf('.') + 1);
- switch (eventType) {
- case EntryEvent.ENTRY_ADDED: // 创建博客文章
- listener.entryAdded(event);
- break;
- case EntryEvent.ENTRY_DELETED: // 删除博客文章
- listener.entryDeleted(event);
- break;
- case EntryEvent.ENTRY_MODIFIED: //修改 博客文章
- listener.entryModified(event);
- break;
- }
- } catch (Exception e) {
- // logger.error(e);
- }
- }
- System.out.println("cost time="+(System.currentTimeMillis()-t1));
- // Profiler.end("msgDispatchEvent");
- }
- }
package com.yanek.event; import java.util.ArrayList;
/**
* 博客文章事件分发器
* @author Administrator
*
*/
public class EntryEventDispatcher { private static EntryEventDispatcher instance = new EntryEventDispatcher();
private ArrayList listeners=new ArrayList(); public static EntryEventDispatcher getInstance() {
return instance;
} private EntryEventDispatcher() { String[] observers = PropertyMgr.getProperty("observers").split(",");
for(String s : observers) { System.out.println(s);
try {
this.addListener((EntryListener)(Class.forName(s).newInstance()));
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} } public synchronized void addListener(EntryListener listener) {
System.out.println(":"+listener);
if (listener == null) {
System.out.println(":"+listener);
throw new NullPointerException();
} else {
listeners.add(listener);
return;
}
} public synchronized void removeListener(EntryListener listener) {
listeners.remove(listener);
} public void dispatchEvent(EntryEvent event) {
// System.out.println("msgDispatchEvent");
int eventType = event.getEventType();
long t1=System.currentTimeMillis();
System.out.println("kaishi="+t1);
for (int i = 0; i < listeners.size(); i++) {
try {
EntryListener listener = (EntryListener) listeners.get(i);
String name = listener.getClass().getName();
name = name.substring(name.lastIndexOf('.') + 1); switch (eventType) {
case EntryEvent.ENTRY_ADDED: // 创建博客文章
listener.entryAdded(event);
break; case EntryEvent.ENTRY_DELETED: // 删除博客文章
listener.entryDeleted(event);
break; case EntryEvent.ENTRY_MODIFIED: //修改 博客文章
listener.entryModified(event);
break; } } catch (Exception e) {
// logger.error(e);
} } System.out.println("cost time="+(System.currentTimeMillis()-t1)); // Profiler.end("msgDispatchEvent");
}
}
5. 博客文章管理器类
- package com.yanek.event;
- /**
- * 博客文章管理器
- * @author Administrator
- *
- */
- public class EntryManager {
- /**
- * @param args
- */
- public static void main(String[] args) {
- EntryManager eventManager=new EntryManager();
- Entry entry=new Entry();
- entry.setId(1);
- entry.setName("test");
- eventManager.addEntry(entry); //创建
- eventManager.modifyEntry(entry); //修改
- eventManager.deleteEntry(entry); //删除
- }
- public void addEntry(Entry entry) {
- System.out.println("add entry ...id="+entry.getId());
- // 事件分发
- EntryEvent event = new EntryEvent(EntryEvent.ENTRY_ADDED, entry, null);
- EntryEventDispatcher.getInstance().dispatchEvent(event);
- }
- public void deleteEntry(Entry entry) {
- System.out.println("delete entry ...id="+entry.getId());
- // 事件分发
- EntryEvent event = new EntryEvent(EntryEvent.ENTRY_DELETED, entry, null);
- EntryEventDispatcher.getInstance().dispatchEvent(event);
- }
- public void modifyEntry(Entry entry) {
- System.out.println("modify entry ...id="+entry.getId());
- // 事件分发
- EntryEvent event = new EntryEvent(EntryEvent.ENTRY_MODIFIED, entry, null);
- EntryEventDispatcher.getInstance().dispatchEvent(event);
- }
- }
package com.yanek.event; /**
* 博客文章管理器
* @author Administrator
*
*/ public class EntryManager { /**
* @param args
*/
public static void main(String[] args) { EntryManager eventManager=new EntryManager();
Entry entry=new Entry();
entry.setId(1);
entry.setName("test"); eventManager.addEntry(entry); //创建 eventManager.modifyEntry(entry); //修改 eventManager.deleteEntry(entry); //删除
} public void addEntry(Entry entry) {
System.out.println("add entry ...id="+entry.getId()); // 事件分发
EntryEvent event = new EntryEvent(EntryEvent.ENTRY_ADDED, entry, null);
EntryEventDispatcher.getInstance().dispatchEvent(event); } public void deleteEntry(Entry entry) {
System.out.println("delete entry ...id="+entry.getId()); // 事件分发
EntryEvent event = new EntryEvent(EntryEvent.ENTRY_DELETED, entry, null);
EntryEventDispatcher.getInstance().dispatchEvent(event); } public void modifyEntry(Entry entry) {
System.out.println("modify entry ...id="+entry.getId());
// 事件分发
EntryEvent event = new EntryEvent(EntryEvent.ENTRY_MODIFIED, entry, null);
EntryEventDispatcher.getInstance().dispatchEvent(event); } }
6. 辅助工具类:
- package com.yanek.event;
- import java.io.IOException;
- import java.util.Properties;
- public class PropertyMgr {
- private static Properties props = new Properties();
- static {
- try {
- props.load(PropertyMgr.class.getClassLoader().getResourceAsStream("com/yanek/event/config.properties"));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static String getProperty(String key) {
- return props.getProperty(key);
- }
- }
package com.yanek.event; import java.io.IOException;
import java.util.Properties; public class PropertyMgr {
private static Properties props = new Properties(); static {
try {
props.load(PropertyMgr.class.getClassLoader().getResourceAsStream("com/yanek/event/config.properties"));
} catch (IOException e) {
e.printStackTrace();
}
} public static String getProperty(String key) {
return props.getProperty(key);
}
}
7.相关配置文件:
配置分发器处理时需要的监听器实现类的列表。
config.properties
内容如下:
observers=com.yanek.event.IndexManager,com.yanek.event.ScoreManager,com.yanek.event.EmailManager
四 测试运行结果:
执行: EntryManager 即可看到效果:
add entry ...id=1
com.yanek.event.IndexManager
:com.yanek.event.IndexManager@3d3c53
com.yanek.event.ScoreManager
:com.yanek.event.ScoreManager@3d3f58
com.yanek.event.EmailManager
:com.yanek.event.EmailManager@3d425b
kaishi=1404547648004
IndexManager 处理 博客文章被创建事件。
ScoreManager 处理 博客文章被创建事件。
EmailManager 处理 博客文章被创建事件。
cost time=1
modify entry ...id=1
kaishi=1404547648006
IndexManager 处理 博客文章被修改事件。
ScoreManager 处理 博客文章被修改事件。
EmailManager 处理 博客文章被修改事件。
cost time=1
delete entry ...id=1
kaishi=1404547648007
IndexManager 处理 博客文章被删除事件。
ScoreManager 处理 博客文章被删除事件。
EmailManager 处理 博客文章被删除事件。
cost time=0
五。关于该方案系统如何实现灵活扩展
假设有如下需求增加了,比如 发表文章,修改文章,删除文章后需要需要给好友发短信通知或其他相关功能,则只需要再写一个监听器的实现类,加入到配置文件中即可。
具体就不写代码了,大家可以自己加上测试。
六、关于资源下载:
地址: http://download.csdn.net/detail/5iasp/7596885
本篇博文参加了CSDN博文大赛,如果您觉得这篇博文不错,希望您能帮我投一票,谢谢!
投票地址:http://vote.blog.csdn.net/Article/Details?articleid=37054171
学习是一种信仰,分享是一种美德
关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用的更多相关文章
- Spring事件发布与监听机制
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 目录 ...
- java 24 - 2 GUI之监听机制和适配器改进窗口关闭
我们创建了窗体后,就要对窗体进行操作,比如关闭窗口.而这时候就要建立监听机制: 事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做出的处理方案 ...
- 简述Java中Http/Https请求监听方法
一.工欲善其事必先利其器 做Web开发的人总免不了与Http/Https请求打交道,很多时候我们都希望能够直观的的看到我们发送的请求参数和服务器返回的响应信息,这个时候就需要借助于某些工具啦.本文将采 ...
- java中的四种监听类用法
在此列举四种方法: 自身类实现ActionListener接口,作为事件监听器 通过匿名类处理 通过内部类处理 通过外部类处理 下面依次介绍: 第一种:自身类实现ActionListener接口,作为 ...
- SpringBoot几个重要的事件回调、监听机制
(1).需要配置在META-INF/Spring.factories 1.ApplicationContextInitializer // // Source code recreated from ...
- Java 中的事件监听机制
看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. ...
- spring 自定义事件发布及监听(简单实例)
前言: Spring的AppilcaitionContext能够发布事件和注册相对应的事件监听器,因此,它有一套完整的事件发布和监听机制. 流程分析: 在一个完整的事件体系中,除了事件和监听器以外,还 ...
- Java中的事件监听机制
鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...
- 4.JAVA之GUI编程事件监听机制
事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...
随机推荐
- HDU 1003 Max Sum(AC代码)
#include <stdio.h> int main(){ int i,t,j,n,x; int start,end,temp,max,sum; scanf("%d" ...
- 跟开涛老师学shiro -- 身份验证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- Prepared Java infrastructure for distributed scenarios
code is sited on: https://github.com/zhoujiagen/javaiospike progress 2015/5/27 Nio/Nio2 examples, us ...
- html--整站制作
1.样式初置 body,div,ul,ol,h1,h2,h3,h4,h5,p,form,input,textarea,select{margin:0;padding:0;} li{list-style ...
- docker容器互联
link方式 http://blog.csdn.net/halcyonbaby/article/details/42112325 通过link方式创建容器,然后我们可以使用被link容器的别名进行访问 ...
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...
- 《Java程序设计》第6周学习总结
学号20145220 <Java程序设计>第6周学习总结 教材学习内容总结 InputStream与OutputStream 10.1.1串流设计的概念 Java将输入/输出抽象化为串流, ...
- HTML里的id等属性命名需要注意
提交 $(function(){ $('#submit').click(function(){ $('#form').submit() }) }) 这里的代码无法完成提交,因为id被命名为submit ...
- 【转】 iOS日常学习 - iOS10上关于NSPhotoLibraryUsageDescription等问题
原文网址:http://blog.csdn.net/wang631106979/article/details/52578001 最近升级了Xcode8.0,真是很多坑啊,填完一个来另外一个,今天又遇 ...
- Dtrace for Linux 2016
http://www.brendangregg.com/blog/2016-10-27/dtrace-for-linux-2016.html