标签:
文章标题:左右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
本篇博文參加了CSDN博文大赛。如果您认为这篇博文不错,希望您能帮我投一票,谢谢!
投票地址:http://vote.blog.csdn.net/Article/Details?
articleid=37054171
版权声明:本文博主原创文章。博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4854929.html