2014-02-08 28 views
4

從Symfony2中的此事件的組件文檔:Symfony2中的設計模式:EventDispatcher是介體還是事件聚合器?

的Symfony2的此事件組件實現簡單而有效的方法Mediator模式,使所有這些東西可能,使您的項目真正可擴展。

我一直在閱讀約Event Aggregator和調解員模式及其differences。對我來說,它看起來像Event Aggregator是Mediator的一個特例,它使用事件來促進溝通,並且沒有任何業務邏輯。另一方面,調解人是更通用的,並且可以允許一些業務邏輯來決定是否應該通過某種通信。

所以我檢查Symfony2中的此事件或TraceableEventDispatcher的源代碼,並發現,如果事件傳播已停止可能改變通信的唯一邏輯檢查,如下:

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

這是爲什麼此事件中Symfony2實現中介模式,但不是事件聚合模式?如果要檢查isPropagationStopped的邏輯是否已從EventDispatcher(即向事件偵聽器)移出,那麼這將實現Event Aggregator?

+0

作爲本次活動唯一的聚合「已經知道」如何轉發一個事件,您的假設聽起來是正確的:唯一的區別是關於*,其中*業務邏輯 – DonCallisto

回答

3

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

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

安東尼費拉拉有很大blog post討論這件事情