这可能对SO来说太模糊了。我需要一个类似IObserver<T>
和IOservable<T>
的简单示例。 T实际上是同一类型。
OnNext
会自行创建IOBservable<T>
序列。虽然,this
应该被阻止观察自己。实质上,观察者部分正在订阅多个可观察量,并聚合它们的值,然后将该聚合服务于其他订阅者。
它是继承/实现IObserver<T>
和IOservable<T>
这么简单吗?或者我在这里以错误的方式考虑可组合性?
public struct T
{
}
public class ObserverAndObservable : IObserver<T>, IObservable<T>
{
}
我想要实现的是这样的。想象一下,我有一份oribiting卫星列表,每个卫星都归世界各国所有。我想订阅说,美国(或任何组合有用)然后计算他们的平均GPS位置。
//Satellites are constantly emiting realtime data
List<Satellite> satellites;
IOBserver<Satellite> observer = satellites.ToObservable();
IDisposable observable = observer.Where(x => string.Equals(x.Name, "USSatellite")).Subscribe();
//Now, compute the GPS average of the Satellites.
//This is not very fluent. There is probably a way to compose these
//functions using a lambda at the end to do the computation, which in turn
//can be subscribed to by other IOBservers...
答案 0 :(得分:1)
您描述的模式称为Decorator模式。它不仅有效,而且绝大多数Rx.Linq都是用这种模式实现的。
关于你是否应该这样做的问题,我会说不。 Rx.Linq已经有大量的装饰器。在大多数情况下,您应该能够使用Rx.Linq方法来组合所需的装饰器,并且这些方法应该比实现更好地处理边缘情况。
Rx的意思是你可以处理功能编程范例中的事件。因此,您应该学会使用Rx.Net附带的monad,而不是尝试使用过程编程的paradime构建行为。
编辑:这是一个可以实现平均monad的示例方法。
var file = window.print();
答案 1 :(得分:-3)
从技术上讲,让单个类同时实现IObservable<T>
和IObserver<T>
并没有错,但由于每个接口也意味着责任,这样做可能会违反single responsibility principle。
我能想象的唯一一个远程有用的案例是一种“观察者代理”,但这听起来并不是很有用。