由于項目需求,需要為Java提供一套支持事件驅(qū)動機制的類庫,可以實現(xiàn)類似于C#中的event和delegate機制。眾所周知,Java語言本身以及其標準庫中并沒有提供事件驅(qū)動機制的相關(guān)接口,雖然Swing(我且認為其不屬于標準庫,因為一般沒人用:)中存在相關(guān)的類支持該機制以實現(xiàn)組件的事件處理,但它畢竟是與GUI相耦合的,而在其它類型的應用程序中使用起來顯得就有些別扭,缺乏通用性。因此有必要實現(xiàn)一套通用的Java事件驅(qū)動機制類庫,然后將其應用于通用的Java應用程序當中,雖然這并不是什么難事:)
讓我們先考察一下C#的事件驅(qū)動機制編寫方法。C#中提供的event關(guān)鍵字可以很容易的用來定義一個事件,然后通過向事件中添加事件處理函數(shù)(在C#中一般用委托(delegate)來引用一個函數(shù)),觸發(fā)事件就可以調(diào)用相關(guān)的處理函數(shù),也即是事件驅(qū)動的過程。例如:
上面的代碼就是用C#實現(xiàn)的事件驅(qū)動機制的一個簡單的例子,可見是非常簡單的,這都源于C#在語言層面(其實是CLR)提供的便利。遺憾的是Java并不提供這樣的便利,需要人為去實現(xiàn)。下面本文將提供兩種實現(xiàn)事件驅(qū)動機制的方法,僅供參考。
觀察者模式
觀察者模式是一種常用的設(shè)計模式,觀察者(Observer)先通過訂閱被觀察對象(Subject),這樣一旦被觀察者(Subject)發(fā)生某種變化,就會將變化通知觀察者(Observer)。
這種設(shè)計模式剛好可以用于事件驅(qū)動機制,事件(event)相當于被觀察對象(Subject),一旦事件被觸發(fā),就會調(diào)用事件處理函數(shù),可見事件處理函數(shù)(C#中的委托)可以看作是觀察者。因此可以像如下這樣實現(xiàn)上文中的功能。