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