如何将自定义事件从一个对象发送到另一个对象?
我有2个相同类型的工作对象,主类使用worker。如果worker1中的某些条件为真,它应该向主类发送一个事件来切换worker。
这是我的场景:
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();
}
}
我建议您实现观察者模式。然后,你的主类是观察者,工作类是可观察对象(或主体)。当工作线程触发适当的事件时,你的主类会适当地处理它。要小心同步,因为您要处理多个线程。
看看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 );
}
}
首先,请尊重Java命名约定。方法应该以小写字母开头。
如果你想让主对象在worker中发生事情时得到通知,worker必须有一个对主对象的引用:
public void doSomeWork(MainClassThatUsesWorker main) {
if (someCondition) {
main.eventArrived();
}
}
您可能还想接受其他类型的侦听器,而不仅仅是MainClassThatUsesWorker
。在这种情况下,声明一个具有eventArrived
方法的WorkerListener
接口,并以WorkerListener
作为参数。MainClassThatUsesWorker
必须实现这个接口来监听由worker触发的事件,但是其他类也可以实现相同的接口并作为参数传递。