隨著JAVA的迅猛發展,JDK版本的不斷更新,JAVA新的事件模型與舊的JDK模型也有了本質的區別,它的事件模型也有了很大的區別。由於現在的編程都是採用事件驅動,所以很有必要瞭解的事件模型,我們下面從定製事件的實際出發來具體討論。
比如你要實現一個定時器類,它的主要功能是在在一定的時間後,啟動具體的處理事件
因此我們可以設計兩個類:定時器類(Timer)和調用類(Clock),對應的USE CASE的順序圖如下:
在此有兩個說明:1)根據問題的複雜程度,設計Main類。當問題規模較小的時候,可以將“調用類”指定為Main類;2)在此順序圖中運用了回調(CALLBACK)功能。此功能在C++中的實現是通過指標,而在JAVA中沒有指標的概念。我們在此通過介面(Interface)來實現。在此我們採用通用介面設計樣式[1]的服務介面樣式。
就是為了使類的設計具有可擴充性和可複用性,在類的基礎上增加了介面。為了簡便起見,我們只考慮兩個類的互動。由於介面只包括方法,不包含屬性,所以不能擁有其它對象的引用,因此通用介面的模式只有以下三種:
在此應用中我們用上述的服務介面模式來處理事件。由於事件都有兩個參與者:事件的供應者和使用者,因此在事件處理的具體應用中,它又可以細分為“推出事件模式”和“拉進事件模式”。
回調和介面
我們知道程式設計的一個原則:使保持不變的東西和發生變化的東西分離開來[2]。在此我們使用介面來容納易變的代碼(比如,我們在定時器設定的時間後,觸發某些事件,這些事件應該是由使用者來設定的,是可以變化的)。在JAVA中,介面恰好可以實現回調的功能。因此我們利用回調技術將發生變化的代碼封裝在介面中,而保持不變的代碼則“回調”發生變化的代碼。從而是對象具有不同的表達形式,但卻可以接受相同的參數。
具體實現
結合上述的服務介面模式和回調技術,我們建立如下的架構:
TimerListner 介面包含processEvent()方法,在這個方法中放置當事件發生時,我們需要的動作的代碼。以下是程式的示範代碼:
interface TimerListener{
public void processEvent();
}
public Class Clock implements TimerListener{
Clock(){
Timer t=new Timer(this); //向Timer類登記
}
public void processEvent(){
//你的事件處理的代碼
}
}
class Timer extends Thread {
private TimerListener tl;
Timer(TimerListener tl){
this.tl=tl;
}
public void run(){
while(true){
sleep(1000);
tl.processEvent();
}
}
}
參考資料
- UML對象設計與編程
- 《JAVA編程思想》
- 《JAVA2核心技術》
- 《設計模式》
關於作者
|
|
|
唐鹹峰 has authored this article |