java基础学习总结——关于Java中事件分发和监听机制实现的代码实例
2016-08-26 10:11
1406 查看
一、场景假设
假设有博客系统中需要实现如下功能:
系统中用户发布文章,修改文章,删除文章时,需要一些相关的操作需要执行。
发布文章后,给好友发送邮件通知,给用户加积分,对文章做全文索引。
修改文章后,给好友发送邮件修改通知,给用户加积分,对文章重新做全文索引。
删除文章后,给好友发送邮件修改通知,给用户减少积分,对文章重新做全文索引。
二、相关的概念解析
分析如上场景,可以采用事件分发和监听机制来实现。
事件分发和监听有如下几个概念:
事件源:触发事件的对象 如上场景中我们把实体对象作为事件源,发布的文章就是事件源
事件: 对事件源的操作产生事件,例如 发表文章 修改文章,删除文章这些操作就会触发相关的 文章被发表事件,文章被删除事件,文章被修改事件
事件监听器:对事件源各种事件触发执行行为的抽象,包括接口和若干实现类。
比如: 接口需要定义事件源相关事件触发时需要实现的操作接口。
事件分发器:事件分发器主要处理事件的分发和事件监听器的管理,注册和删除事件监听器等。
三、 代码示例
项目结构:
根据上述概念相关代码如下:
包括如下代码
1. 博客文章类 属于事件源
[java] view
plain copy
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. 博客文章事件类 属于事件对象
其中定义了事件的类型和事件源,事件参数
[java] view
plain copy
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. 事件监听器接口和实现类:
定义各种事件发生时需要处理的接口方法
[java] view
plain copy
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。具体代码如下:
[java] view
plain copy
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. 博客文章事件分发器类
[java] view
plain copy
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. 博客文章管理器类
[java] view
plain copy
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. 辅助工具类:
[java] view
plain copy
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
假设有博客系统中需要实现如下功能:
系统中用户发布文章,修改文章,删除文章时,需要一些相关的操作需要执行。
发布文章后,给好友发送邮件通知,给用户加积分,对文章做全文索引。
修改文章后,给好友发送邮件修改通知,给用户加积分,对文章重新做全文索引。
删除文章后,给好友发送邮件修改通知,给用户减少积分,对文章重新做全文索引。
二、相关的概念解析
分析如上场景,可以采用事件分发和监听机制来实现。
事件分发和监听有如下几个概念:
事件源:触发事件的对象 如上场景中我们把实体对象作为事件源,发布的文章就是事件源
事件: 对事件源的操作产生事件,例如 发表文章 修改文章,删除文章这些操作就会触发相关的 文章被发表事件,文章被删除事件,文章被修改事件
事件监听器:对事件源各种事件触发执行行为的抽象,包括接口和若干实现类。
比如: 接口需要定义事件源相关事件触发时需要实现的操作接口。
事件分发器:事件分发器主要处理事件的分发和事件监听器的管理,注册和删除事件监听器等。
三、 代码示例
项目结构:
根据上述概念相关代码如下:
包括如下代码
1. 博客文章类 属于事件源
[java] view
plain copy
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. 博客文章事件类 属于事件对象
其中定义了事件的类型和事件源,事件参数
[java] view
plain copy
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. 事件监听器接口和实现类:
定义各种事件发生时需要处理的接口方法
[java] view
plain copy
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。具体代码如下:
[java] view
plain copy
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. 博客文章事件分发器类
[java] view
plain copy
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. 博客文章管理器类
[java] view
plain copy
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. 辅助工具类:
[java] view
plain copy
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
相关文章推荐
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
- java基础学习——Java添加事件监听的四种方法代码实例
- 左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用
- 关于Java的事件监听机制,可以写一段好的代码吗?
- JAVA基础 day24 GUI的学习 事件监听机制 编写简易的记事本 jar包双击执行
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- Java添加事件监听的四种方法代码实例
- 关于事件监听机制的总结(Listener和Adapter)
- 黑马程序员 java基础 监听事件相关问题学习日志
- 关于链表的一些总结和代码,java实现
- SQLite 锁机制学习总结 锁状态转换及锁机制实现代码分析
- Java基础学习中,关于面向对象中多态、抽象类、接口的总结
- SQLite 锁机制学习总结 锁状态转换及锁机制实现代码分析
- java实现简单的窗体和密码验证(传参,事件机制和事件监听的作用过程)
- JSP基础实例_Java动态实现课程表_学习笔记
- JAVA事件监听机制的实现
- 2014-11-3Android学习------关于R.styleable的问题(一)实例代码--------GIF动画实现
- 基础入门:关于JavaIO流学习总结
- Java添加事件监听的四种方法代码实例