2010-06-04 95 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());