2011-12-27 187 views
1

如何將自定義事件從一個對象發送到另一個對象?
我有2個相同類型的工作對象,主類使用worker。 如果worker1中的某些條件爲真,它應該將ea事件發送到將切換工作人員的主類。創建和發送自定義事件

這是我的情景:

class Worker1 extends Base{ 
    public void DoSomeWork(Arg argument){ 
     if(someCondition=true){ 
      SendEvent(); 
     } 
    } 
} 

class MainClassThatUsesWorker{ 
    Base worker = new Worker1(); 

    public void EventArrived(){ 
     worker = new Worker2();  
    } 

    public void UseWorKer(){ 
     worker.DoSomeWork();  
    } 
} 

回答

2

我建議你實現observer pattern。你的主要班級是觀察員,而工人是可觀察的(或主題)。當工作人員觸發適當的事件時,主要班級會適當地處理它。因爲您使用多個線程,所以要小心同步。

0

首先,請尊重Java命名約定。方法應以小寫字母開頭。

如果你想要當事情發生在工人被通知的主要對象,工人必須具備的主要對象的引用:

public void doSomeWork(MainClassThatUsesWorker main) { 
    if (someCondition) { 
     main.eventArrived(); 
    } 
} 

您可能還需要接受其他類型的聽衆則剛MainClassThatUsesWorker。在這種情況下,聲明具有eventArrived方法的接口WorkerListener,並以WorkerListener作爲參數。 MainClassThatUsesWorker將不得不實現這個接口來監聽worker所觸發的事件,但其他類也可能實現相同的接口並作爲參數傳遞。

2

看看Swing等是如何做到的。基本上你定義了一個事件類和一個由主類(或其他處理程序)實現的Listener接口。然後,您向發件人註冊該事件,即將它們放入某個集合中,並在事件觸發時迭代該集合並調用偵聽器的處理方法。

像這樣(簡化):

class MyEvent { ... }; 

interface MyListener { 
    void handleEvent(MyEvent e); 
} 

//inside the worker class 
public void SendEvent() { 
    MyEvent e = new MyEvent(); 
    for(MyListener l : listeners) { 
    l.handleEvent(e); 
    } 
}