[英]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.