1. 程式人生 > >關於JAVA中事件分發和監聽機制實現的程式碼例項-絕對原創實用

關於JAVA中事件分發和監聽機制實現的程式碼例項-絕對原創實用

轉載:http://blog.csdn.net/5iasp/article/details/37054171

謝謝博主

=======================================================================================================

文章標題:關於Java中事件分發和監聽機制實現的程式碼例項

作者: javaboy2012
Email:[email protected]
qq:    1046011462

一、場景假設

假設有部落格系統中需要實現如下功能:

系統中使用者釋出文章,修改文章,刪除文章時,需要一些相關的操作需要執行。


釋出文章後,給好友傳送郵件通知,給使用者加積分,對文章做全文索引。
修改文章後,給好友傳送郵件修改通知,給使用者加積分,對文章重新做全文索引。
刪除文章後,給好友傳送郵件修改通知,給使用者減少積分,對文章重新做全文索引。

二、相關的概念解析

   分析如上場景,可以採用事件分發和監聽機制來實現。

 
  事件分發和監聽有如下幾個概念:


 事件源:觸發事件的物件 如上場景中我們把實體物件作為事件源,釋出的文章就是事件源

 事件: 對事件源的操作產生事件,例如 發表文章 修改文章,刪除文章這些操作就會觸發相關的 文章被髮表事件,文章被刪除事件,文章被修改事件

 事件監聽器:對事件源各種事件觸發執行行為的抽象,包括介面和若干實現類。

    比如: 介面需要定義事件源相關事件觸發時需要實現的操作介面。

 事件分發器:事件分發器主要處理事件的分發和事件監聽器的管理,註冊和刪除事件監聽器等。   

三、 程式碼示例

專案結構:


根據上述概念相關程式碼如下:


  包括如下程式碼

  1. 部落格文章類  屬於事件源

  1. package com.yanek.event;  
  2. /** 
  3.  * 部落格文章 
  4.  * @author Administrator 
  5.  * 
  6.  */
  7. publicclass Entry {  
  8.     publiclong getId() {  
  9.         return id;  
  10.     }  
  11.     publicvoid setId(long id) {  
  12.         this.id = id;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     publicvoid setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.     privatelong id; // 編號
  21.     private String name; //標題
  22. }  

2. 部落格文章事件類 屬於事件物件

其中定義了事件的型別和事件源,事件引數

  1. package com.yanek.event;  
  2. import java.util.Collections;  
  3. import java.util.Date;  
  4. import java.util.Map;  
  5. /** 
  6.  * 部落格文章事件 
  7.  * @author Administrator 
  8.  * 
  9.  */
  10. publicclass EntryEvent  
  11. {  
  12.     publicstaticfinalint ENTRY_ADDED = 100//事件型別:部落格文章被建立
  13.     publicstaticfinalint ENTRY_DELETED = 101;//事件型別:部落格文章被刪除
  14.     publicstaticfinalint ENTRY_MODIFIED = 102;//事件型別:部落格文章被修改
  15.     privateint eventType; //事件型別
  16.     private Entry entry; //部落格文章物件
  17.     private Date date; //事件觸發日期
  18.     private Map params; //事件輔助引數
  19.     public EntryEvent(int eventType, Entry entry, Map params) {  
  20.         this.eventType = eventType;  
  21.         this.entry = entry;  
  22.         this.params = params != null ? Collections.unmodifiableMap(params)  
  23.                 : null;  
  24.         date = new Date();  
  25.     }  
  26.     publicint getEventType() {  
  27.         return eventType;  
  28.     }  
  29.     public Entry getEntry() {  
  30.         return entry;  
  31.     }  
  32.     public Map getParams() {  
  33.         return params;  
  34.     }  
  35.     public Date getDate() {  
  36.         return date;  
  37.     }  
  38. }  

3. 事件監聽器介面和實現類:

定義各種事件發生時需要處理的介面方法

  1. package com.yanek.event;  
  2. /** 
  3.  * 部落格文章監聽器介面 
  4.  * @author Administrator 
  5.  * 
  6.  */
  7. publicinterface EntryListener  
  8. {  
  9.     /** 
  10.      * 部落格文章被建立 
  11.      * @param entryevent 
  12.      */
  13.     publicabstractvoid entryAdded(EntryEvent entryevent);   
  14.     /** 
  15.      * 部落格文章被刪除 
  16.      * @param entryevent 
  17.      */
  18.     publicabstractvoid entryDeleted(EntryEvent entryevent);  
  19.     /** 
  20.      * 部落格文章被修改 
  21.      * @param entryevent 
  22.      */
  23.     publicabstractvoid entryModified(EntryEvent entryevent);  
  24. }  

事件監聽器介面的實現類:


   實現場景中的三類操作,監聽器介面實現包括如下三個類實現

   
  IndexManager 索引管理器類 
  ScoreManager 積分管理器類
  EmailManager 郵件管理器類

  三個類都實現監聽器介面EntryListener。具體程式碼如下:

  1. package com.yanek.event;  
  2. /** 
  3.  * 郵件管理器 
  4.  * @author Administrator 
  5.  * 
  6.  */
  7. publicclass EmailManager implements EntryListener{  
  8.     @Override
  9.     public