【问题标题】:Observe the specific type of event观察具体的事件类型
【发布时间】:2013-06-14 11:27:28
【问题描述】:

我在 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 之外的任何新库,以使每个观察者仅侦听特定类型的事件。

【问题讨论】:

    标签: java jakarta-ee java-ee-6 observer-pattern observers


    【解决方案1】:
    • 您可以为每种事件类型使用单独的队列/事件:

    public void observeEvent(@Observes MyEventOfType1 事件)
    public void observeEvent(@Observes MyEventOfType2 事件)

    • 在通用队列之上构建过滤队列:过滤队列过滤事件类型。然后让消费者观察过滤后的队列。

    伪代码:

    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 事件)
    public void observeEvent(@Observes @EventType2 MyEvent 事件)

    查看 Oracle 的 example,以及限定符是如何使用的 defined

    【讨论】:

    • 谢谢,但您能详细解释一下前两个选项吗?我不想使用第三个,因为它可能会在源代码中引入更多的重复和复杂性,即所有事件的处理方式大多相似,几乎没有区别。
    • 我已经更新了我的答案。而且我添加了另一个选项(限定符),这似乎是在这种情况下最典型的事情(但我从未使用过它)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2021-05-20
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多