我在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旁边使用任何新的库,以使每个观察者只监听特定类型的事件。
答案 0 :(得分:1)
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)