2011-12-30 71 views
0

我正在研究SplObserver模式作爲解決日誌記錄問題的一種方式(即,如何處理活動日誌記錄而不直接在您感興趣的類中實現它,並因此將代碼放入它們中與他們的責任範圍直接相關)。SplObserver通知問題

問題是,作爲實施,SplObserver似乎沒有給你任何類型的通知類發送任何細節的觀察類,而不是「我正在觸發通知」的標準化機制。

我很好奇其他人如何解決這個問題,他們擴展SplObserver和SplSubject接口還是自己推出?

如果有可能實現觀察者模式,觀察者可以指定它只希望得到通知,我還認爲在更一般的術語中(如可以用觀察者實現的其他功能,而不是必須記錄)某些事件,而不是事件可能產生的每個事件。例如,我可能需要一個將所有活動記錄到日誌文件的日誌記錄觀察程序,但也會出現一個錯誤報告觀察程序,當發生錯誤時會向管理員發送電子郵件,但只有在發生錯誤時纔會發送。您可以編寫錯誤記錄器來忽略未由錯誤觸發的通知(假定可以修改此模式以便發送特定種類的通知),但我懷疑這樣做效率會低於理想狀態。我懷疑允許觀察者只訂閱特定的主題事件會更好,但是這種方法可以用SplObserver實現嗎?

+1

自從問了一段時間。我將其標記爲最愛,因爲我對可能的答案感興趣。你有沒有達到自己的解決方案? – 2012-01-26 00:52:21

+0

不是迄今爲止。它現在在後面的燃燒器上。 – GordonM 2012-01-26 07:08:32

回答

3

splSubject在發送通知時自己發送。在主題中實現回調方法是可能的,所以觀察者可以找出究竟發生了什麼變化。

function update(SplSubject $subject) { 
    $changed = $subject->getChanges(); 
    .... 
} 

您將不得不創建一個新的接口來強制getChanges()在主體中的存在。

在不同類型的通知中,您可以看看消息隊列系統。它們允許您訂閱不同的消息框('logging.error','logging.warning',甚至'logging'),如果另一個系統(主題)將消息發送到相應的隊列,它們將接收通知。作爲splObserver/splSubject,它們並不難實現。