gpt4 book ai didi

Java - 事件处理设计

转载 作者:搜寻专家 更新时间:2023-11-01 03:09:41 25 4
gpt4 key购买 nike

我正在尝试开发一个基于处理某些事件和生成数据的系统。每个事件将包含(可能)几个不同的字段,每个监听器将处理一些或它们。我想到了以下两种方法

  1. 在事件生成类中,我将注册多个事件监听器,每个监听器监听事件特定字段的一个特定值,例如:

    public class MicroListener implements Listener {

    public void processEvent(Event e){
    if(e.getName().equals(registeredName)) { ... }
    }

这很诱人,因为处理是在对象本身内完成的,没有集中处理事件,而是允许每个对象处理信息。缺点(可能是致命的)是每个事件(几十万个事件中的一个)都必须广播给所有听众,而实际上只有一小部分会用它做某事。从长远来看,它可能会产生很大的性能影响......

  1. 集中式监听器,它将监听所有事件并对其采取行动,并将处理委托(delegate)给相应的事件处理器,例如:

     public class CentralListener implements Listener {

    Map<String, Processor> processorsByName;

    public void processEvent(Event e){
    processorsByName.get(e.getName()).process(e);
    }
    }

这会更快,但它需要单独的映射或处理器集合来处理事件的任何其他部分,例如检查事件 ID 等的处理器。这不是方法 1 中的情况。因为我们将简单地生成另一组监听器并将它们注册到事件生成类。

你们对这些有什么看法?它们是否有意义,或者您宁愿提出完全不同的建议?

最佳答案

这是一个常见的设计决策,我认为没有适用于所有(甚至大多数)情况的通用答案。我可以列出两种方法的各种权衡,但它们可能是显而易见的。在高层次上,在考虑可能的性能影响之前,我会支持最适合概念模型的任何设计(并且不会创建一堆无关的类)。

如果性能是最重要的,那么在整数事件 ID 上使用大型 switch/case block 切换的集中式 Controller 可能是最快的。 ...随着时间的推移,也是最不灵活/难以维护的。

您可能想要查看 Guava project's EventBus .它使用注释来注册事件监听器,并为此类事件广播/订阅提供非常干净的 api。事件订阅者根据他们在方法签名中声明的事件类型得到通知。它非常流畅并且节省了很多样板文件。我不知道它扩展到数千种事件类型的效果如何,但与一些类似的库不同,事件总线不是全局的。您可以在需要时创建不同的事件总线实例来分离事件处理。

关于Java - 事件处理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com