首页 > 代码库 > 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

文章标题:关于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{	@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");	}}


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

 

 

学习是一种信仰,分享是一种美德