文章标题:左右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. 博客文章类  属于事件源

  1. package com.yanek.event;
  2. /**
  3. * 博客文章
  4. * @author Administrator
  5. *
  6. */
  7. public class Entry {
  8.  
  9. public long getId() {
  10. return id;
  11. }
  12. public void setId(long id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. private long id; // 编号
  22. private String name; //标题
  23.  
  24. }

2. 博客文章事件类 属于事件对象

当中定义了事件的类型和事件源,事件參数

  1. package com.yanek.event;
  2.  
  3. import java.util.Collections;
  4. import java.util.Date;
  5. import java.util.Map;
  6. /**
  7. * 博客文章事件
  8. * @author Administrator
  9. *
  10. */
  11. public class EntryEvent
  12.  
  13. {
  14.  
  15. public static final int ENTRY_ADDED = 100; //事件类型:博客文章被创建
  16. public static final int ENTRY_DELETED = 101;//事件类型:博客文章被删除
  17. public static final int ENTRY_MODIFIED = 102;//事件类型:博客文章被改动
  18.  
  19. private int eventType; //事件类型
  20. private Entry entry; //博客文章对象
  21. private Date date; //事件触发日期
  22. private Map params; //事件辅助參数
  23.  
  24. public EntryEvent(int eventType, Entry entry, Map params) {
  25. this.eventType = eventType;
  26. this.entry = entry;
  27. this.params = params != null ?
  28.  
  29. Collections.unmodifiableMap(params)
  30. : null;
  31. date = new Date();
  32. }
  33.  
  34. public int getEventType() {
  35. return eventType;
  36. }
  37.  
  38. public Entry getEntry() {
  39. return entry;
  40. }
  41.  
  42. public Map getParams() {
  43. return params;
  44. }
  45.  
  46. public Date getDate() {
  47. return date;
  48. }
  49. }

3. 事件监听器接口和实现类:

定义各种事件发生时须要处理的接口方法

  1. package com.yanek.event;
  2. /**
  3. * 博客文章监听器接口
  4. * @author Administrator
  5. *
  6. */
  7. public interface EntryListener
  8. {
  9. /**
  10. * 博客文章被创建
  11. * @param entryevent
  12. */
  13. public abstract void entryAdded(EntryEvent entryevent);
  14.  
  15. /**
  16. * 博客文章被删除
  17. * @param entryevent
  18. */
  19.  
  20. public abstract void entryDeleted(EntryEvent entryevent);
  21.  
  22. /**
  23. * 博客文章被改动
  24. * @param entryevent
  25. */
  26. public abstract void entryModified(EntryEvent entryevent);
  27.  
  28. }

事件监听器接口的实现类:

实现场景中的三类操作。监听器接口实现包含例如以下三个类实现

IndexManager 索引管理器类
  ScoreManager 积分管理器类
  EmailManager 邮件管理器类

三个类都实现监听器接口EntryListener。

详细代码例如以下:

  1. package com.yanek.event;
  2.  
  3. /**
  4. * 邮件管理器
  5. * @author Administrator
  6. *
  7. */
  8. public class EmailManager implements EntryListener{
  9.  
  10. @Override
  11. public void entryAdded(EntryEvent entryevent) {
  12.  
  13. System.out.println("EmailManager 处理 博客文章被创建事件。
  14.  
  15. ");
  16.  
  17. }
  18.  
  19. @Override
  20. public void entryDeleted(EntryEvent entryevent) {
  21.  
  22. System.out.println("EmailManager 处理 博客文章被删除事件。
  23.  
  24. ");
  25. }
  26. @Override
  27. public void entryModified(EntryEvent entryevent) {
  28.  
  29. System.out.println("EmailManager 处理 博客文章被改动事件。
  30.  
  31. ");
  32.  
  33. }
  34.  
  35. }
  36.  
  37. package com.yanek.event;
  38. /**
  39. * 索引管理器
  40. * @author Administrator
  41. *
  42. */
  43. public class IndexManager implements EntryListener {
  44.  
  45. @Override
  46. public void entryAdded(EntryEvent entryevent) {
  47.  
  48. System.out.println("IndexManager 处理 博客文章被创建事件。
  49.  
  50. ");
  51.  
  52. }
  53.  
  54. @Override
  55. public void entryDeleted(EntryEvent entryevent) {
  56. // TODO Auto-generated method stub
  57. System.out.println("IndexManager 处理 博客文章被删除事件。");
  58.  
  59. }
  60.  
  61. @Override
  62. public void entryModified(EntryEvent entryevent) {
  63. // TODO Auto-generated method stub
  64. System.out.println("IndexManager 处理 博客文章被改动事件。");
  65. }
  66.  
  67. }
  68.  
  69. package com.yanek.event;
  70. /**
  71. * 积分管理器
  72. * @author Administrator
  73. *
  74. */
  75. public class ScoreManager implements EntryListener {
  76.  
  77. @Override
  78. public void entryAdded(EntryEvent entryevent) {
  79. System.out.println("ScoreManager 处理 博客文章被创建事件。");
  80.  
  81. }
  82.  
  83. @Override
  84. public void entryDeleted(EntryEvent entryevent) {
  85. // TODO Auto-generated method stub
  86. System.out.println("ScoreManager 处理 博客文章被删除事件。");
  87. }
  88.  
  89. @Override
  90. public void entryModified(EntryEvent entryevent) {
  91. // TODO Auto-generated method stub
  92.  
  93. System.out.println("ScoreManager 处理 博客文章被改动事件。");
  94.  
  95. }
  96.  
  97. }

4. 博客文章事件分发器类

  1. package com.yanek.event;
  2.  
  3. import java.util.ArrayList;
  4. /**
  5. * 博客文章事件分发器
  6. * @author Administrator
  7. *
  8. */
  9. public class EntryEventDispatcher {
  10.  
  11. private static EntryEventDispatcher instance = new EntryEventDispatcher();
  12. private ArrayList listeners=new ArrayList();
  13.  
  14. public static EntryEventDispatcher getInstance() {
  15. return instance;
  16. }
  17.  
  18. private EntryEventDispatcher() {
  19.  
  20. String[] observers = PropertyMgr.getProperty("observers").split(",");
  21. for(String s : observers) {
  22.  
  23. System.out.println(s);
  24. try {
  25. this.addListener((EntryListener)(Class.forName(s).newInstance()));
  26. } catch (InstantiationException e) {
  27. e.printStackTrace();
  28. } catch (IllegalAccessException e) {
  29. e.printStackTrace();
  30. } catch (ClassNotFoundException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34.  
  35. }
  36.  
  37. public synchronized void addListener(EntryListener listener) {
  38. System.out.println(":"+listener);
  39. if (listener == null) {
  40. System.out.println(":"+listener);
  41. throw new NullPointerException();
  42. } else {
  43. listeners.add(listener);
  44. return;
  45. }
  46. }
  47.  
  48. public synchronized void removeListener(EntryListener listener) {
  49. listeners.remove(listener);
  50. }
  51.  
  52. public void dispatchEvent(EntryEvent event) {
  53. // System.out.println("msgDispatchEvent");
  54. int eventType = event.getEventType();
  55. long t1=System.currentTimeMillis();
  56. System.out.println("kaishi="+t1);
  57. for (int i = 0; i < listeners.size(); i++) {
  58. try {
  59. EntryListener listener = (EntryListener) listeners.get(i);
  60. String name = listener.getClass().getName();
  61. name = name.substring(name.lastIndexOf('.') + 1);
  62.  
  63. switch (eventType) {
  64. case EntryEvent.ENTRY_ADDED: // 创建博客文章
  65. listener.entryAdded(event);
  66. break;
  67.  
  68. case EntryEvent.ENTRY_DELETED: // 删除博客文章
  69. listener.entryDeleted(event);
  70. break;
  71.  
  72. case EntryEvent.ENTRY_MODIFIED: //改动 博客文章
  73. listener.entryModified(event);
  74. break;
  75.  
  76. }
  77.  
  78. } catch (Exception e) {
  79. // logger.error(e);
  80. }
  81.  
  82. }
  83.  
  84. System.out.println("cost time="+(System.currentTimeMillis()-t1));
  85.  
  86. // Profiler.end("msgDispatchEvent");
  87. }
  88. }

5. 博客文章管理器类

  1. package com.yanek.event;
  2.  
  3. /**
  4. * 博客文章管理器
  5. * @author Administrator
  6. *
  7. */
  8.  
  9. public class EntryManager {
  10.  
  11. /**
  12. * @param args
  13. */
  14. public static void main(String[] args) {
  15.  
  16. EntryManager eventManager=new EntryManager();
  17. Entry entry=new Entry();
  18. entry.setId(1);
  19. entry.setName("test");
  20.  
  21. eventManager.addEntry(entry); //创建
  22.  
  23. eventManager.modifyEntry(entry); //改动
  24.  
  25. eventManager.deleteEntry(entry); //删除
  26. }
  27.  
  28. public void addEntry(Entry entry) {
  29. System.out.println("add entry ...id="+entry.getId());
  30.  
  31. // 事件分发
  32. EntryEvent event = new EntryEvent(EntryEvent.ENTRY_ADDED, entry, null);
  33. EntryEventDispatcher.getInstance().dispatchEvent(event);
  34.  
  35. }
  36.  
  37. public void deleteEntry(Entry entry) {
  38. System.out.println("delete entry ...id="+entry.getId());
  39.  
  40. // 事件分发
  41. EntryEvent event = new EntryEvent(EntryEvent.ENTRY_DELETED, entry, null);
  42. EntryEventDispatcher.getInstance().dispatchEvent(event);
  43.  
  44. }
  45.  
  46. public void modifyEntry(Entry entry) {
  47. System.out.println("modify entry ...id="+entry.getId());
  48. // 事件分发
  49. EntryEvent event = new EntryEvent(EntryEvent.ENTRY_MODIFIED, entry, null);
  50. EntryEventDispatcher.getInstance().dispatchEvent(event);
  51.  
  52. }
  53.  
  54. }

6. 辅助工具类:

  1. package com.yanek.event;
  2.  
  3. import java.io.IOException;
  4. import java.util.Properties;
  5.  
  6. public class PropertyMgr {
  7. private static Properties props = new Properties();
  8.  
  9. static {
  10. try {
  11. props.load(PropertyMgr.class.getClassLoader().getResourceAsStream("com/yanek/event/config.properties"));
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16.  
  17. public static String getProperty(String key) {
  18. return props.getProperty(key);
  19. }
  20. }

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示例代码事件分发和监督机制来实现-绝对原创有用的更多相关文章

  1. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  2. Spark 跑 java 示例代码

    一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...

  3. 【cocos2d-js官方文档】事件分发监听机制(摘录)

    简介 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处理用户交互就需要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件处理逻 ...

  4. Android事件分发传递回传机制详解

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接   http://blog.csdn.net/qq_32059827/article/details/5257701 ...

  5. Android事件分发和消费机制(转载)

    原文链接:http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html Android 中与 Touch 事件相关的方法包括:dispatc ...

  6. jxl创Excel档java示例代码说明

    记得下载 并 导入jxl.jar 包,免积分下载地址:http://download.csdn.net/detail/u010011052/7561041 package Test; import j ...

  7. 【朝花夕拾】Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/10998855.html]谢谢! 在自定义View中,经常需要处理Android事件分发的问题, ...

  8. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  9. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

随机推荐

  1. 使用form的target属性屏蔽url跳

    target: 指定公开赛, action URL. 关键点: 让target指向隐藏的iframe demo: form.jsp <%@ page language="java&qu ...

  2. App设计相关网站

    http://sketch.im/ 设计素材 principle  动效软件 http://principleformac.com/ 官网 http://principlecn.com/ 中文网

  3. 网络基础知识系列:阐述VLAN和Trunk

    网络性能是影响的效率的重要因素. 大的广播域分割方法,旨在提高网络性能.一个接口上,可是,路由器的LAN接口数量有限,它的主要功能是在网络间数据传输,而不是对终端设备提供网络接入. 訪问LAN的功能还 ...

  4. Discuz 楼主帖子采集

    try { ; i < ; i++) { var html = GetHtmls("http://bbs.fobshanghai.com/viewthread.php?tid=3885 ...

  5. cocos2d-x 3.1.1 学习笔记[21]cocos2d-x 创建过程

    文章出自于  http://blog.csdn.net/zhouyunxuan RootViewController.h #import <UIKit/UIKit.h> @interfac ...

  6. HDU - 5186 - zhx&#39;s submissions (精密塔尔苏斯)

    zhx's submissions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  7. 小丁带你走进git的世界三-撤销修改(转)

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  8. iOS coreData

    static int row=0; static const NSString *kStoryboardName = @"LRCoreDataViewController"; st ...

  9. AndroidManifest:VersionCode和VersionName

    Google为APK定义了两个关于版本号属性:VersionCode和VersionName,他们有不同的用途. VersionCode:对消费者不可见.仅用于应用市场.程序内部识别版本号,推断新旧等 ...

  10. Java对存储过程的调用方法

    本文将介绍Java怎样实现对存数过程的调用方法,作者用了几个样例进行了具体的说明,简单明了,很适合刚開始学习的人. 一.Java怎样实现对存储过程的调用: A:不带输出參数的 create proce ...