2014-12-05 90 views
1

我只是試圖解釋觀察者模式給一個同事在C#應用程序中使用。我表示應該很容易通過查找一些MSDN文檔來實現。然而,我驚訝地發現MSDN的例子偏離了我被教過觀察者模式的方式。請注意,我主要使用了Java中的模式,但我的印象是.NET的實現幾乎相同。.Net觀察者模式更改。這是什麼時候發生的?爲什麼?

我知道的模式使用方法Notify,Subscribe和Unsubscribe。在MSDN上解釋的這個新實現使用OnNext,OnCompleted,OnError和Subscribe。但是,我可以從幾年前的文章中找到解釋Notify版本的文章。乍一看,這個新版本似乎不必要的複雜,它讓我有些困惑。從什麼時候開始實施,爲什麼這樣實施?笏是優勢?

回答

3

請記住,.NET Observer接口與MS Reactive Extensions密切相關。如果你想了解OnError/OnCompleted提供的附加功能,這可能是研究的最佳地點。其餘的模式非常符合原樣:

  1. 訂閱仍然只是訂閱。
  2. 取消訂閱旨在通過處理Subscribe返回的上下文來實現。
  3. OnNext對應於通知。

所以真正唯一的新功能是OnError(提供一個並行的錯誤報告通道讓觀察者知道observable已進入錯誤狀態)和OnCompleted(讓觀察者知道observable不會提供更多的消息)。你可以通過消息中的細節來完成這個任務,以指示這些狀態轉換,但是如果你將一個observable想象成一種可以進行狀態改變的消息通道正交於消息本身的意圖。

1

要查看的四個接口如下所示。

IEnumerable<T> 
    IEnumerator<T> GetEnumerator() 

IEnumerator<T> 
    bool MoveNext() 
    T Current { get; } 
    void Dispose() 

IObservable<T> 
    IDisposable Subscribe(IObserver<T>) 

IObserver<T> 
    void OnNext(T) 
    void OnError(Exception) 
    void OnCompleted() 

IEnumerable<T>IObservable<T>接口IEnumerator<T>IObserver<T>也是如此。 交互式接口,IEnumerable<T>IEnumerator<T>,使用語義來描述一個序列的T s。 反應性接口IObservable<T>IObserver<T>,使用語義來描述T的序列。

假設我有一個名爲eIEnumerator<T>。當我打電話e.MoveNext()隨後e.Current在成功的情況下,我在概念上獲得的三兩件事之一:

  • e.MoveNext()回報true,我得到了T
  • e.MoveNext()拋出Exception
  • e.MoveNext()回報false和我已完成

請注意這些如何完全對應於IObserver<T>方法OnNext,OnErrorOnCompleted。所不同的是在IEnumerator<T>的情況下我出信息但在IObserver<T>的情況下我的信息。

當我呼叫IEnumerator<T>.Dispose時,T的順序被取消。同樣,當我在IObservable<T>.Subscribe返回的IDisposable上調用Dispose時,T的順序被取消。

當我撥打電話IEnumerable<T>.GetEnumerator了一個IEnumerator<T>。當我撥打IObservable<T>.Subscribe我推IObserver<T>

相關問題