.NET中也有IObservable和IObserver接口(也在此处和此处)。有趣的是,IObserver的具体实现并没有直接引用IObservable。它不知道订阅了谁。它只能调用取消订阅者。“请拉销以退订。”
编辑:取消订阅者实现IDisposable
。我认为,采用这种方案是为了防止监听程序失效。
但是,有两件事对我来说并不完全清楚。
- 内部的Unsubscriber类是否提供“订阅并忘记”行为?谁(确切地说是何时)致电
IDisposable.Dispose()
取消订阅者?垃圾收集器(GC)不确定。
[免责声明:总体而言,与C#相比,我在C和C ++上花费的时间更多。] 如果我要向观察者K订阅可观察的L1并且观察者已经订阅了其他一些可观察的L2,应该怎么办?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
当我针对MSDN的示例运行此测试代码时,观察者仍然订阅L1。这在实际开发中将是特殊的。可能有3种方法可以改善此问题:
- 如果观察者已经有一个取消订阅者实例(即它已经订阅了),那么在订阅一个新的提供者之前,它会悄悄地取消订阅原始提供者。这种方法掩盖了一个事实,即它不再订阅原始提供程序,这以后可能会感到惊讶。
- 如果观察者已经具有取消订阅者实例,则将引发异常。行为规范的调用代码必须显式取消订阅观察者。
- 观察者订阅了多个提供者。这是最吸引人的选项,但是可以使用IObservable和IObserver来实现吗?让我们来看看。观察者可以保留一个非订户对象列表:每个源一个。不幸的是,
IObserver.OnComplete()
没有提供回发给提供者的参考。因此,具有多个提供程序的IObserver实现将无法确定要取消订阅的提供程序。
.NET的IObserver是否打算订阅多个IObservable?
教科书对观察者模式的定义是否要求一个观察者必须能够订阅多个提供者?还是可选的并且依赖于实现?