簡體   English   中英

Symfony2中的設計模式:EventDispatcher是Mediator或Event Aggregator嗎?

[英]Design pattern in Symfony2: is EventDispatcher a Mediator or Event Aggregator?

從Symfony2的EventDispatcher組件文檔:

Symfony2 EventDispatcher組件以簡單有效的方式實現Mediator模式,使所有這些事情成為可能,並使您的項目真正可擴展。

我一直在閱讀有關Event Aggregator和Mediator模式及其差異的內容 對我而言,事件聚合器看起來像是Mediator的一個特例,它使用事件來促進溝通,並且內部沒有任何業務邏輯。 另一方面,Mediator更通用,並且可以允許一些業務邏輯來決定是否應該進行某些通信。

所以我檢查了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嗎?

Event Aggregator類似於Observer模式,Subject只是通知Observer對象有變化,無論它是什么類型的事件都需要更新。

Symfony2的EventDispatcher實現了Mediator模式,因為它的作用類似於路由器,決定了哪個事件將由可以訂閱多個事件的偵聽器觸發。 如您所見,即使刪除isPropagationStopped部分,EventDispatcher仍需要事件名稱來確定要觸發的事件。

安東尼費拉拉有一篇很棒的博客文章討論這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM