您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: