事件模型與觀察者模型的比較

 事件監聽模式其實就是一種觀察者模式,只是角度有點不同,在Java的JavaBean機制以及GUI中都使用了事件監聽模式。在如今AJAX RIA客戶端中,事件監聽模式也成爲一個主要的界面模式。

事件監聽模式分同步和
異步兩種實現方式,JavaBean機制和GUI基本都是同步機制,事件監聽異步模型,需要引入Event Queue。

事件監聽同步模式分兩個部分:Event Source和Event Listener:
Event Source:被監聽者的事件集合,可能是方法,提供事件的註冊加入和移除功能。類似被觀察者的集合。
Event Listener:事件的監聽者,當事件被觸發,所有監聽這個事件的監聽者將被通知,然後執行自己的Action響應動作。

事件監聽
異步模式在Source和Listener之間引入event queue,
event queue是一個基於事件的publish-subscribe. 它一種鬆耦合方式提供不同模塊和角色之間
異步通訊。它比同步更加鬆耦合,這樣,我們就把Source-Listener改成了publish-queue-subscribe方式。

事件監聽模式使用在客戶端RIA比較多,因爲這裏是用戶輸入的源頭,是事件發生的源頭。而且在目前WOA趨勢下,事件監聽模式不能只單獨侷限於RIA客戶端這個範圍,還需要把事件通過http形式傳遞到服務器端,也就是跨客戶端和服務器的,事件必須和服務器的PUSH異步結合在一起。這是一種先進的架構設計。

基於Javascript的ZK 5 RIA已經實現了這種先進的事件監聽模式,見:
http://docs.zkoss.org/wiki/ZK_5:_Chat_with_Event_Queue#Event_queues_and_server_push

如果將這種異步的事件模式和服務器的OSGI結合,那麼在服務器端更新一個Jar模塊,可以主動通知到客戶端瀏覽器,
這對服務器端模塊管理很有好處。
http://bundle-exception.blogspot.com/2009/07/zk-on-osgi-dynamic-asynchronous.html

 

嚴格來說:MVC模式是一種同步機制,MVC的Controller是Mediator模式,而Mediator模式的特點和缺點就是封裝通訊,而Observer模式則是分離通訊。

實踐證明:象Observer這種分離通訊的做法是符合可
伸縮性要求的,而Mediator模式這種封裝通訊是不可伸縮的。

所以,可以說MVC模式是不可伸縮的,所以,纔有
REST替代一說,也可以在MVC中引入事件模式。ZK5的設計就是這種基於MVC模式基礎上的事件異步架構。

所以,現在只是使用一個MVC的Web框架已經遠遠不滿足
伸縮性要求。

說得不客氣的話:現在所有的基於MVC框架,如Struts 2或Webwork JSF Wicket,如果不在其上引入
異步事件框架,都是不合格的,都是落後的技術。

 

 

現在所有的基於MVC框架,如Struts 2或Webwork JSF Wicket,如果不在其上引入異步事件框架,都是不合格的,都是落後的技術。

我覺得這些MVC框架不支持
異步是因爲其基於jsp/servlet封裝起來的,servlet2.x 全都不支持異步,底層都不支持,指望上層架構如何能實現?所以要麼等servlet3.0規範爲大多數應用服務器實現之時,要麼乾脆摒棄jsp/servlet和主流servlet容器,用mina封裝通訊,第三方包解析http,freemaker定製頁面模板,實現真正的異步

 

OSGI的白板模式Whiteboard Pattern比原始監聽模式的要更進一步,將OSGI的事件機制引入,相當於producer + OSGI + Consumer。白板模式具體見:http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf

文中案例代碼是利用OSGI本身的ServiceTracker服務跟蹤監聽類作爲Listener的觸發機制,這樣,基於OSGI開發事件模式,就不用把Listener註冊到Source,從而發生緊耦合,只要雙方直接註冊到OSGI中就可以了。

這就是利用service registry來實現雙方的解耦,也就是利用OSGI框架內部bundle(inter-bundle)依賴來實現event source和event listener的鬆耦合,可節省維持event source和event listener之間事件關係代碼。

TSS上一篇文章利用OSGI的版本模式實現了IRC機器人聊天的功能,並在Consumer方實現一個onMessage方法,這個方法非常類似JMS中Consumer的onMessage,
文章代碼如下:
The Whiteboard Pattern for OSGi
http://www.theserverside.com/news/thread.tss?thread_id=49380

個人認爲:OSGI的這種producer + OSGI + Consumer和zk5的publish-queue-subscribe異步有些類似之處,或者可以說,可以將OSGI白板模式作爲異步事件模式使用。因爲事件生產方產生事件後就自行結束,屬於fire and forget方式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章