zoukankan      html  css  js  c++  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

     本篇博文參加了CSDN博文大赛。如果您认为这篇博文不错,希望您能帮我投一票,谢谢!

    投票地址:http://vote.blog.csdn.net/Article/Details?

    articleid=37054171

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

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    [CSP校内集训]hotel
    DP小技巧——悬线法
    [SDOI2015]寻宝游戏/异象石(LCA)
    [HAOI2006]旅行
    [SDOI2013]泉(搜索+hash+容斥)
    [NOIP校内集训]home
    [AHOI2014/JSOI2014]骑士游戏(SPFA的本质)
    欧拉函数模板
    开学考试题8:神奇的集合(multiset) 动态开点线段树
    开学考试题5:2017黑龙江省选
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4854929.html
Copyright © 2011-2022 走看看