麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

在EJB環境中實現“觀察者”模式

2019-11-18 13:36:35
字體:
來源:轉載
供稿:網友

  在EJB環境中實現“觀察者”模式

Observer模式(“觀察者”模式)或許是降低對象結合程度的最佳方法之一。例如,在編寫一個典型的應用程序時,你可能決定提供一個工廠或治理器觸發適當的事件,以這些事件的一組監聽器的形式提供分離的業務邏輯;此后,系統的啟動類就在工廠或者治理器創建完畢之后,把這些監聽器關聯到工廠或者治理器。

在大多數J2EE系統中,這種工廠/治理器都是無狀態的會話Bean。EJB容器處理對無狀態會話Bean的請求,根據請求創建無狀態會話Bean的實例,或重用現有的實例。問題在于,每次初始化一個新的Bean實例時都必須伴有一組監聽器,這組監聽器和為其他實例而運行的監聽器完全相同。合理的方案應該是,當一個無狀態會話Bean實例被創建的時候,它訪問某個知識庫,通過一定的方法獲知相關的監聽器,然后建立和這些監聽器的關系。在這篇文章中,我要介紹的就是如何實現這一方案。

一種典型的情形
請考慮下面這種典型的情形。一個在線拍賣系統有一個無狀態會話Bean,名為AUCtionFactory,這個Bean創建拍賣(auction)對象。對于每一個新創建的拍賣對象,業務邏輯要求系統執行一些附加的操作,比如發送email、更新用戶摘要文件,等等。在許多系統上,創建拍賣對象和執行這些附加操作的代碼如下所示:

public Auction createAuction(int numOfContainers) throws RemoteException{ SomeAuctionClass auction = new SomeAuctionClass (numOfContainers); // 創建拍賣對象之后,接下來要編寫下面這種執行附加操作的代碼 //(而不是簡單地發送一個“拍賣對象已經創建”的事件) sendEmailsAboutNewAuction(auction); updateUserPRofiles(auction); doOtherNotificationStuffAboutNewAuction(auction); //等等.... return auction;}


之所以要編寫這種質量很差的代碼,原因就在于初始化各個Bean實例時附帶一組必需的監聽器很困難。假如這個Bean是一個事件發布者,而且每一個Bean實例初始化的時候都帶有一組它需要的監聽器,上述代碼可以變得更簡潔、更強壯,例如:

public Auction createAuction(int numOfContainers) throws RemoteException{ SomeAuctionClass auction = new SomeAuctionClass (numOfContainers); fireAuctionCreated(auction); return auction;}


基本原理說明
實現本文技巧的基本原理其實很簡單。一個ListenerRegistry類實現事件發布者類和必須關聯到該類的監聽器之間的映射。系統的啟動模塊初始化ListenerRegistry,為每一種發布者類型初始化一組必需的監聽器。當發布者被創建或激活,它就訪問ListenerRegistry,把它的類傳遞給ListenerRegistry,獲得一組監聽器。然后,發布者把所有這些監聽器關聯到自身。就這么簡單。


你也許會很自然地問,“什么是ListenerSupplier?”和“為什么不直接注冊和使用EventListener?”確實可以;事實上,該框架的第一個版本就是直接使用事件監聽器。但是,假如在ListenerRegistry中使用監聽器,這些監聽器必須在注冊的時候就存在。另一方面,假如注冊的是一個“中介者”ListenerSupplier(監聽器提供者),你就可以自由地把創建/提取監聽器延遲到它絕對必需的時候。ListenerSupplier類似于工廠,但兩者的不同之處在于,ListenerSupplier并非必定要創建新的監聽器,它的目標是返回監聽器。每次getListener()方法被調用時,ListenerSupplier是創建一個新的監聽器,還是每次都返回同一實例,這一切由開發者自己決定。

因此,結合運用ListenerRegistry和監聽器提供者,我們可以在事件發布者和觀察者(或監聽器)不存在的情況下,建立兩者之間的關系。可以認為,這個優點很重要,它延遲了發布者和觀察者的實例化。

具體實現
在這一部分,你將看到整個框架中所有組成部分的實現代碼。我假定你已經了解必要的基礎知識,比如EJB、同步,當然還有java核心庫。完整的源代碼可以從本文最后下載。

下面是ListenerRegistry接口的代碼:

//ListenerRegistry.javapackage com.jwasp.listener;import java.util.EventListener;import java.rmi.RemoteException;import com.jwasp.listener.ListenerSupplier;/*** 框架的核心。實現事件發布者類和監聽器提供者之間的映射*/public interface ListenerRegistry {void addListenerSupplier(ListenerSupplier listenerSupplier, Class publisherClass);void removeListenerSupplier(ListenerSupplier listenerSupplier, Class publisherClass);EventListener[] getListeners(Class publisherClass) throws RemoteException, ListenerActivationException;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲一区中文字幕 | 综合网天天色 | 国产1区2区3区在线观看 | 精品国产一区二区三区天美传媒 | 中文字幕一二三区芒果 | 久草成人在线 | 国产乱子视频 | 国产精品呻吟 | 午夜激情视频网站 | 粉嫩粉嫩一区二区三区在线播放 | 欧美另类综合 | 永久av在线免费观看 | 久久嗨| 国产在线观看一区二区三区 | 久久国产精品电影 | 国产成年人在线观看 | 欧美一级美国一级 | 免费观看一区 | 高清国产福利 | 日本中文字幕久久 | 亚洲午夜天堂吃瓜在线 | 精品国产一区二区三区四 | 国产一级在线观看视频 | 亚洲一级片免费观看 | h色视频在线观看 | 欧美wwwsss9999 | a级高清免费毛片av在线 | 欧美一级美片在线观看免费 | 视频一区二区在线播放 | 久久精品视频免费 | 一级电影在线观看 | 成人在线视频黄色 | 国产一区二区三区四区在线 | 午夜在线视频观看 | 久久久久久久网站 | 久久99精品久久久久久小说 | 一本一道久久久a久久久精品91 | 国产亚洲精品成人a | 欧美毛片 | 亚洲午夜天堂吃瓜在线 | 国产品久久 |