我从今天早上开始一直在研究Observer,但是似乎无法弄清楚如何使用内置接口来实现它。我已经看过一些示例,但是找不到任何simple示例。
到目前为止,这是我的代码,受Microsoft Documentation启发:
class ObservableClass : IObservable<bool>, IDisposable
{
public bool observableBool;
public List<IObserver<bool>> observers;
public ObservableClass()
{
this.observableBool = false;
this.observers = new List<IObserver<bool>>();
}
public IDisposable Subscribe(IObserver<bool> observer)
{
if (!observers.Contains(observer))
{
AddObserver(observer);
}
return this;
}
public void Dispose()
{
Console.WriteLine("Disposing...");
}
public void AddObserver(IObserver<bool> obs)
{
this.observers.Add(obs);
}
public void RemoveObserver(IObserver<bool> obs)
{
this.observers.Remove(obs);
}
public void SwapBool()
{
observableBool = !observableBool;
}
}
可观察类包含observableBool
字段。当该字段的值更改时,我想通知观察者。
这是我的观察员:
class ObserverClass : IObserver<bool>
{
public IDisposable observable;
public void OnCompleted()
{
Console.WriteLine("Completed");
}
public void OnError(Exception error)
{
Console.WriteLine("error");
}
public void OnNext(bool value)
{
Console.WriteLine("Next");
}
public virtual void Subscribe(IObservable<bool> obs)
{
if (obs != null)
observable = obs.Subscribe(this);
}
public void stopObserve()
{
observable.Dispose();
}
}
最后是我的程序:
static void Main(string[] args)
{
ObservableClass observable = new ObservableClass();
ObserverClass observer = new ObserverClass();
observer.Subscribe(observable);
Console.WriteLine("subscribed observer");
observable.SwapBool();
Console.WriteLine("performed swapBool");
}
预期输出:
subscribed observer
Completed //Returned by ObserverClass.OnComplete()
performed swapBool
如何进行这项工作?ObserverClass
每次更改时如何调用OnComplete和observableBool
的其他方法?
我知道还有其他方法可以做到这一点,但我的目标是能够使用IObserver和IObservable。
您遍历一组可观察对象以通知它们:
public void SwapBool()
{
observableBool = !observableBool;
foreach (observable in observers)
{
observable.OnNext(observableBool);
}
}
您应该在有新值时调用OnNext
。 OnComplete
用于通知将没有更多值。
我刚刚注意到您的观察值是IDisposable
...
首先,处置Subscribe
的结果应取消该观察者的订阅。不处理可观察对象。
实际上,我希望处理可观察的对象意味着它将不再发送值(在每个人身上调用OnComplete
并释放观察者列表)。
其他问题包括: