我在 Java EE 中使用观察者模型,其想法是让一个服务向多个观察者触发事件。然而,尽管所有观察者都在监听同一个事件,但每个观察者只对事件内部指定的特定事件类型感兴趣。我当前的代码是这样的:
public class Service {
public void fireEvent(EventType type) {
MyEvent event = new MyEvent(type);
fire(event);
}
}
public class TypeAObserver {
public void observeEvent(@Observes MyEvent event) {
if (EventType.TYPE_A.equals(event.getType()) {
// do something
}
}
}
public class TypeBObserver {
public void observeEvent(@Observes MyEvent event) {
if (EventType.TYPE_B.equals(event.getType()) {
// do something
}
}
}
正如您所看到的,所有观察者都必须在执行进一步操作之前检查类型,这会增加源代码内的重复。而且,由于所有观察者都会收到相同的事件,而只有少数观察者真正处理它,这恐怕会带来不必要的性能开销。
因此,我正在寻找其他方法,最好不使用 Java EE 之外的任何新库,以使每个观察者仅监听特定类型的事件。
最佳答案
- 您可以为每种事件类型使用单独的队列/事件:
public void observeEvent(@Observes MyEventOfType1 event)
public void observeEvent(@Observes MyEventOfType2 event)
- 在通用队列之上构建过滤队列:过滤队列根据事件类型进行过滤。然后让消费者观察过滤后的队列。
伪代码:
public class TypeAFilter {
List listeners ll = ArrayList<Listener>();
public void add(Listener l) {
l.add(ll);
}
public void observeEvent(@Observes MyEvent event) {
if (EventType.TYPE_A.equals(event.getType()) {
for (Listener l : ll) {
l.observeEvent(event);
}
}
}
}
}
这基本上意味着过滤器过滤器既是观察者又是可观察的。过滤器正在观察您的服务,特定事件的消费者附加到过滤器。
考虑将
instanceof
与不同的事件类一起使用,但我不确定它是否真的比equals
更快使用限定符:
public void observeEvent(@Observes @EventType1 MyEvent event)
public void observeEvent(@Observes @EventType2 MyEvent event)
关于java - 观察特定类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165655/