我想在Java中實現一個有多個事件源(線程)的設計。此類事件源完成特定任務,並且必須通知唯一的事件處理程序(Class),並且必須根據事件源通知完成其他任務。Java,設計模式:多個事件源和一個事件處理程序
我的問題是:如何在Java中以適當的方式實現這個desiqn? 有一個類似於這種設計的設計模式?
謝謝你提前:)。
我想在Java中實現一個有多個事件源(線程)的設計。此類事件源完成特定任務,並且必須通知唯一的事件處理程序(Class),並且必須根據事件源通知完成其他任務。Java,設計模式:多個事件源和一個事件處理程序
我的問題是:如何在Java中以適當的方式實現這個desiqn? 有一個類似於這種設計的設計模式?
謝謝你提前:)。
我認爲你正在尋找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();
}
}
的回調方法中使用了一個同步塊。謝謝Justin的回覆。 我嘗試了這個解決方案,但是問題出現在Threads(被認爲是Observable)中,因爲我的線程已經從另一個類繼承,並且如果你想使用Observable,你必須從它延伸,並且正如你所知,不允許多重繼承在Java中。 你有什麼建議嗎? – Zakaria 2010-06-04 17:13:08
你的線程可以包含一個Observable,或者你可以讓你的基類擴展Observable。除了其他原因外,使用runnable(而不是擴展Thread)是首選。 – Justin 2010-06-04 17:49:10
謝謝! 我瞭解你的想法,並實施它。 但我真的不明白你的代碼示例: 首先,我們不能實現Observable,我們必須擴展它。可能你的意思是觀察員。 如果這是正確的你的代碼示例是好的。 – Zakaria 2010-06-04 18:21:07
聽起來像演員模式給我。每個線程都扮演一個角色,完成一項任務。結果設置在隊列中(是),由下一個演員處理。
雖然我沒有Java演員框架的經驗。請向Google諮詢。
謝謝Arjan Molenaar的迴應。 我將谷歌爲Java的Actor框架,你能給我進一步的解釋嗎? – Zakaria 2010-06-04 17:15:01
在GWT中,這被稱爲event bus。無論是GWT。 HandlerManager或GWTx。 PropertyChangeSupport是Google推薦的實現。後者在J2SE 1.4.2以上版本中可用
也許我不明白你的問題,但我認爲你不需要任何設計模式,但是從java.util.concurrent包中得到了一些東西。
ThreadPoolExecutor?
可觀察模式對線程沒有意見。在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());
大聲笑@答案:3種不同的模式! – Pindatjuh 2010-06-04 16:50:56
你能給我一個嗎? – Zakaria 2010-06-04 17:15:23
很好的問題,我只是在處理程序類 – fasseg 2010-06-04 17:42:36