2010-06-04 94 views
7

我想在Java中實現一個有多個事件源(線程)的設計。此類事件源完成特定任務,並且必須通知唯一的事件處理程序(Class),並且必須根據事件源通知完成其他任務。Java,設計模式:多個事件源和一個事件處理程序

我的問題是:如何在Java中以適當的方式實現這個desiqn? 有一個類似於這種設計的設計模式?

謝謝你提前:)。

+0

大聲笑@答案:3種不同的模式! – Pindatjuh 2010-06-04 16:50:56

+0

你能給我一個嗎? – Zakaria 2010-06-04 17:15:23

+0

很好的問題,我只是在處理程序類 – fasseg 2010-06-04 17:42:36

回答

3

我認爲你正在尋找Observer模式。 Java確實有一些標準接口(java.util.Observer,java.util.Observable),儘管它們不是類型特定的;所以你可能會考慮你自己的,如果該領域似乎需要它。

class MyThread implements Runnable { 
Observable observable; 

public MyThread(EventHandler observer) { 
    observable = new Observable(); 
    observable.addObserver(observer); 
} 

public void run() { 
    while (!done()) { 
    Object result = doStuff(); 
    observable.notifyObservers(result); 
    } 
} 
} 

// might have this be singleton 
class EventHandler implements Observer { 
public synchronized void update(Observable o, Object arg) { 
    accomplishOtherTask(); 
} 
} 
+0

的回調方法中使用了一個同步塊。謝謝Justin的回覆。 我嘗試了這個解決方案,但是問題出現在Threads(被認爲是Observable)中,因爲我的線程已經從另一個類繼承,並且如果你想使用Observable,你必須從它延伸,並且正如你所知,不允許多重繼承在Java中。 你有什麼建議嗎? – Zakaria 2010-06-04 17:13:08

+0

你的線程可以包含一個Observable,或者你可以讓你的基類擴展Observable。除了其他原因外,使用runnable(而不是擴展Thread)是首選。 – Justin 2010-06-04 17:49:10

+0

謝謝! 我瞭解你的想法,並實施它。 但我真的不明白你的代碼示例: 首先,我們不能實現Observable,我們必須擴展它。可能你的意思是觀察員。 如果這是正確的你的代碼示例是好的。 – Zakaria 2010-06-04 18:21:07

0

聽起來像演員模式給我。每個線程都扮演一個角色,完成一項任務。結果設置在隊列中(是),由下一個演員處理。

雖然我沒有Java演員框架的經驗。請向Google諮詢。

+0

謝謝Arjan Molenaar的迴應。 我將谷歌爲Java的Actor框架,你能給我進一步的解釋嗎? – Zakaria 2010-06-04 17:15:01

0

GWT中,這被稱爲event bus。無論是GWT。 HandlerManager或GWTx。 PropertyChangeSupport是Google推薦的實現。後者在J2SE 1.4.2以上版本中可用

+0

感謝您的回覆。 我可以將這些實現用於非GUI事件嗎? – Zakaria 2010-06-04 18:24:10

+0

HandlerManager只是一個觀察者隊列。在HandlerManager上觸發事件時,管理員將檢查每個觀察者是否可以響應事件。如果可以的話,那麼過載服務器將被調用適當的參數等等。 – 2010-06-04 19:31:36

+0

是的,Zakaria,java.beans.PropertyChangeSupport可用於非GUI事件。 – Glenn 2010-06-05 01:14:15

0

也許我不明白你的問題,但我認爲你不需要任何設計模式,但是從java.util.concurrent包中得到了一些東西。

ThreadPoolExecutor?

0

可觀察模式對線程沒有意見。在EventThread pattern中,監聽器可以聲明在什麼線程中以及何時處理事件。

public class MyObservableObject { 
    ... 
    void addListener(MyListener listener, Executor executor); 
} 
public interface MyListener { 
    void onEvent(Object sender, Object event); 
} 

// Example 
obj.addListener(myListener, CURRENT_THREAD); 
obj.addListener(myListener, myWorkQueue); 
obj.addListener(myListener, AWT_EDT); // or SWT_EDT 
obj.addListener(myListener, Executors.newSingleThreadScheduledExecutor());