左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用
文章标题:左右JAVA示例代码事件分发和监督机制来实现
文章地址: http://blog.csdn.net/5iasp/article/details/37054171
作者: javaboy2012
Email:yanek@163.com
qq:    1046011462
一、场景如果
如果有博客系统中须要实现例如以下功能:
系统中用户公布文章。改动文章。删除文章时,须要一些相关的操作须要运行。
公布文章后,给好友发送邮件通知。给用户加积分,对文章做全文索引。
改动文章后,给好友发送邮件改动通知。给用户加积分,对文章又一次做全文索引。
删除文章后。给好友发送邮件改动通知,给用户降低积分,对文章又一次做全文索引。
二、相关的概念解析
分析如上场景。能够採用事件分发和监听机制来实现。
事件分发和监听有例如以下几个概念:
事件源:触发事件的对象 如上场景中我们把实体对象作为事件源,公布的文章就是事件源
事件: 对事件源的操作产生事件,比如 发表文章 改动文章,删除文章这些操作就会触发相关的 文章被发表事件,文章被删除事件。文章被改动事件
事件监听器:对事件源各种事件触发运行行为的抽象,包含接口和若干实现类。
比方: 接口须要定义事件源相关事件触发时须要实现的操作接口。
事件分发器:事件分发器主要处理事件的分发和事件监听器的管理。注冊和删除事件监听器等。
三、 代码演示样例
项目结构:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvNWlhc3A=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
依据上述概念相关代码例如以下:
包含例如以下代码
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
学习是一种信仰,分享是一种美德
版权声明:本文博主原创文章。博客,未经同意不得转载。
左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用的更多相关文章
- 通俗理解Android事件分发与消费机制
		
深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...
 - Spark 跑 java 示例代码
		
一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...
 - 【cocos2d-js官方文档】事件分发监听机制(摘录)
		
简介 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处理用户交互就需要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件处理逻 ...
 - Android事件分发传递回传机制详解
		
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/5257701 ...
 - Android事件分发和消费机制(转载)
		
原文链接:http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html Android 中与 Touch 事件相关的方法包括:dispatc ...
 - jxl创Excel档java示例代码说明
		
记得下载 并 导入jxl.jar 包,免积分下载地址:http://download.csdn.net/detail/u010011052/7561041 package Test; import j ...
 - 【朝花夕拾】Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑
		
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/10998855.html]谢谢! 在自定义View中,经常需要处理Android事件分发的问题, ...
 - 常用 Java 静态代码分析工具的分析与比较
		
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
 - [转载] 常用 Java 静态代码分析工具的分析与比较
		
转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...
 
随机推荐
- JSplitPane demo
			
package example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; imp ...
 - The area面积计算
			
Problem Description Ignatius bought a land last week, but he didn't know the area of the land becaus ...
 - C++ primer札记10-继承
			
包.继承,多态性C++的三个基本概念,在这里,我们重点总结继承的东西 1 类派生列表 类派生列表中指定一个派生类继承基类,来自列表与一个或多个基类如: class B : public A1,prot ...
 - js比量undefined种类
			
js比量undefined种类 if (reValue== undefined) { alert("undefined"); } 发现推断不出来.最后查了下资料要用type ...
 - css+js整站变灰(兼容IE7+)
			
原文:css+js整站变灰(兼容IE7+) 历年大型地震等自然灾害来临过后,各大网站整站都变成灰色以悼念逝去的生命,那么这种整站变灰的效果是怎么做到的? 重写一套css?NO,即便你有这个时间重写,那 ...
 - UBuntu经常使用的操作(网络资源)
			
http://docs.google.com/Doc? id=dqsbw4c_46d89djccr 版权声明:本文博主原创文章.博客,未经同意不得转载.
 - 关于苹果公司最新的语言Swift
			
Swift供IOS和OSX新的编程语言开发的应用程序,吸取C和Objective-C质朴的语言.但没有损失C兼容性语言.Swift使用安全的编程模型.增加各种现代编程语言功能,使语言更容易掌握.更具可 ...
 - 【转】Android内存机制分析1——了解Android堆和栈
			
昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...
 - 设计模式之空对象(Null Object)模式
			
通过引用Null Object,用于取消业务逻辑中对对象的为空推断 类图: Nullable: package com.demo.user; public interface Nullable { b ...
 - KMP该算法解释(最长公共子)
			
一个:介绍KMP算法之前,首先解释一下BF算法 (1)BF算法(传统的匹配算法,是最简单的算法) BF算法是一种常见的模式匹配算法,BF该算法的思想是目标字符串S模式串的第一个字符P的第一个字符,以匹 ...