C#内部有二个泛型接口,IObservable<T>和IObserver<T>,IObservable是可观察的,就是主题Subject要实现的接口,IObserver是观察者要实现的接口,首先建一个WeatherData结构,这是主题要向观察者传递的数据。
public struct WeatherData
{
private double temperature;//温度
private double humidity;//湿度
public double Temperature
{
get => temperature;
}
public double Humidity
{
get => humidity;
}
public WeatherData(double temp,double humidity)
{
this.temperature = temp;
this.humidity = humidity;
}
}
再建一个实现IObservable的类WeatherDataProvider,IObservable接口就一个很简单的方法 public IDisposable Subscribe(IObserver<T> observer),这个方法就是向内部的列表添加观察者,再返回一个可销毁的对象,所以要建一个私有的列表
//观察者列表
private List<IObserver<WeatherData>> observers;
还要在实现一个内部类,这个类用于返回可销毁的对象,所以要实现IDisposable接口,这个内部类很简单,就是保存一个观察者列表的引用,一个观察者的引用,在Dispose方法内从观察者列表中删除观察者,完整代码如下
private class Unsubscriber : IDisposable
{
private List<IObserver<WeatherData>> _observers;
private IObserver<WeatherData> _observer;
public Unsubscriber(List<IObserver<WeatherData>> observers, IObserver<WeatherData> observer)
{
this._observers = observers;
this._observer = observer;
}
public void Dispose()
{
if (_observer != null && _observers.Contains(_observer))
{
_observers.Remove(_observer);
}