2014-12-05 73 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>

相关问题