Symfony2中的设计模式:EventDispatcher是中介者还是事件聚合器?

5

来自Symfony2的EventDispatcher组件文档:

Symfony2的EventDispatcher组件以简单有效的方式实现了中介者模式,使所有这些事情成为可能,并使您的项目真正具有可扩展性。

我一直在阅读Event Aggregator和Mediator模式及其differences。对我来说,Event Aggregator看起来是中介者的一个特定案例,它使用事件来促进通信,并且内部没有任何业务逻辑。另一方面,中介者更加通用,可以允许一些业务逻辑决定是否应该进行某些通信。

因此,我检查了Symfony2的EventDispatcher或TraceableEventDispatcher的源代码,并发现唯一可能改变通信的逻辑是检查事件传播是否已停止,如下所示:

protected function doDispatch($listeners, $eventName, Event $event)
{
    foreach ($listeners as $listener) {
        call_user_func($listener, $event, $eventName, $this);
        if ($event->isPropagationStopped()) {
            break;
        }
    }
}

这就是为什么Symfony2中的EventDispatcher实现Mediator模式而不是Event Aggregator模式吗?如果将检查isPropagationStopped的逻辑移出EventDispatcher(比如移到事件监听器中),那么这会实现Event Aggregator吗?

由于事件聚合器只需要“知道”如何转发事件,所以您的假设是正确的:唯一的区别在于业务逻辑的位置 - DonCallisto
1个回答

3

事件聚合器类似于观察者模式,主题只通知观察者对象发生了变化,这些对象需要更新无论是什么类型的事件。

Symfony2的EventDispatcher实现了中介者模式,因为它就像一个路由器,决定哪个事件将被监听器触发,监听器可以订阅多个事件。正如您所看到的,即使删除了isPropagationStopped部分,EventDispatcher仍然需要事件名称才能确定要触发哪个事件。

Anthony Ferrara有一篇很棒的博客文章讨论了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接