事件,双重调度和抽象事件处理

时间:2019-01-21 21:02:35

标签: c++ events architecture

想象一个简单的双调度事件处理方案:

enter image description here

太酷了。此外,它的工作原理。但是我在这里看到了几个问题:

  1. EventHandlerInterface必须明确知道所有事件。
  2. 由于(1)的原因,处理程序可能会因为订阅未使用的事件而具有较大的空间开销。

我希望这种结构看起来像这样:

enter image description here

如您所见,我想要由不同模块生成的单独事件类型,并且我希望每个模块仅实现必要的事件处理接口。我不确定如何将所有这些联系在一起。理想情况下,我希望有一个准备好接受任何事件的EventServices列表。

我在这里可以想到的一件事是,对于每个EventHandlerInterface类型都有一个继承的EventService,并在notify方法内部将事件处理程序向下转换为特定类型。但是,它不是类型安全的,看起来像个丑陋的主意。

我可以看到,第二种方法是使EventService成为模板,并静态检查模板参数是否为EventHandlerInterface的子级。那将是类型安全的,并且几乎可以完成我想要的操作。但是,这种方式无法将所有EventServices存储到一个列表/向量中。因此,这种方法不是可取的。

实际上,感觉就像我在寻找错误的方式,但是如何找到我不知道的正确方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不确定访问者模式是否是解决此问题的正确方法。当然,它为您提供了一种实现双重调度的机制,但仅此而已,正如您所说的,它有缺点,例如访客(EventHandlerInterface)必须为每种不同类型的主机(EventInterface)提供重载。这样会产生紧密的耦合,并且只有在不经常将类添加到主机层次结构中时才有意义。

为什么不按照publish-subscribe模式寻求解决方案?它允许松散耦合,并且不需要冗余接口。简而言之,发布者提供一些事件,订阅者可以订阅。触发事件后,将通知订户并进行处理。订阅者仅订阅他们认为相关的事件。对于相同类型的事件,不同的订阅者可以提供不同的处理方式,这似乎是您的情况下双重分发的目的。

在许多语言(例如C#)中,都有特殊的语法可轻松支持此模式。在C ++中,尽管也有其他库,但您需要使用boost signals之类的库。另请参见here