关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
来源:互联网 发布:iphone5s联通4g网络 编辑:程序博客网 时间:2024/05/01 12:30
文章标题:关于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; //标题}
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;}}
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);}
事件监听器接口的实现类:
实现场景中的三类操作,监听器接口实现包括如下三个类实现
IndexManager 索引管理器类
ScoreManager 积分管理器类
EmailManager 邮件管理器类
三个类都实现监听器接口EntryListener。具体代码如下:
package com.yanek.event;/** * 邮件管理器 * @author Administrator * */public class EmailManager implements EntryListener{@Overridepublic void entryAdded(EntryEvent entryevent) {System.out.println("EmailManager 处理 博客文章被创建事件。");}@Overridepublic void entryDeleted(EntryEvent entryevent) {System.out.println("EmailManager 处理 博客文章被删除事件。");}@Overridepublic void entryModified(EntryEvent entryevent) {System.out.println("EmailManager 处理 博客文章被修改事件。");}}package com.yanek.event;/** * 索引管理器 * @author Administrator * */public class IndexManager implements EntryListener {@Overridepublic void entryAdded(EntryEvent entryevent) {System.out.println("IndexManager 处理 博客文章被创建事件。");}@Overridepublic void entryDeleted(EntryEvent entryevent) {// TODO Auto-generated method stubSystem.out.println("IndexManager 处理 博客文章被删除事件。");}@Overridepublic void entryModified(EntryEvent entryevent) {// TODO Auto-generated method stubSystem.out.println("IndexManager 处理 博客文章被修改事件。");}}package com.yanek.event;/** * 积分管理器 * @author Administrator * */public class ScoreManager implements EntryListener {@Overridepublic void entryAdded(EntryEvent entryevent) {System.out.println("ScoreManager 处理 博客文章被创建事件。");}@Overridepublic void entryDeleted(EntryEvent entryevent) {// TODO Auto-generated method stubSystem.out.println("ScoreManager 处理 博客文章被删除事件。");}@Overridepublic void entryModified(EntryEvent entryevent) {// TODO Auto-generated method stubSystem.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");}}
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); }}
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); }}
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中事件分发和监听机制实现的代码实例-绝对原创实用
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
- java基础学习总结——关于Java中事件分发和监听机制实现的代码实例
- 事件监听分发机制
- java中事件监听机制
- Android View中触摸事件分发机制的实现
- Android中Touch 事件的分发和消费机制
- Android中View的事件分发和拦截机制
- Android中View的事件分发和拦截机制
- Android中View的事件分发和拦截机制
- 关于Android事件分发机制的理解
- 关于Android 事件分发机制的学习
- 关于事件分发机制的思考
- 关于android 的事件分发机制
- 关于Android的事件分发机制
- Java中事件处理事件监听机制
- JAVA的事件监听机制
- Java的事件监听机制
- 大数类
- 第八十八题(金山笔试题,字符串移动)
- word插入图片显示不完整的解决办法
- MTK Android Driver :sound
- Evaluate Reverse Polish Notation
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
- 今日作息及食谱(7.5)
- 被卡住的进度条
- Android中覆盖
- 最长上升子序列
- centos 安装 pcre
- 苹果
- 从服务器更新团队项目后pom报错(用Maven管理)的解决方案
- halcon中的划痕检查实例surface_scratch