观察者和被观察者,订阅者和发布者
using System;
// 观察者:订阅天气变化的人
public class WeatherUser : IObserver<string>
{
private readonly string _name;
public WeatherUser(string name) => _name = name;
public void OnCompleted() => Console.WriteLine($"{_name}: 天气预报结束。");
public void OnError(Exception error) => Console.WriteLine($"{_name}: 天气预报出错:{error.Message}");
public void OnNext(string value) => Console.WriteLine($"{_name}: 收到天气预报 -> {value}");
}
// 可观察对象:天气台
public class WeatherStation : IObservable<string>
{
private IObserver<string>? _observer;
public IDisposable Subscribe(IObserver<string> observer)
{
_observer = observer;
return null!; // 简化处理
}
// 发布天气
public void PublishWeather(string weather) => _observer?.OnNext(weather);
// 结束预报
public void EndWeather() => _observer?.OnCompleted();
}
class Program
{
static void Main()
{
var station = new WeatherStation();
var user = new WeatherUser("小明");
// 把观察者(订阅者)通过subcribe方法塞到被观察者(发布者)里面,然后就是在被观察者中调用OnNext方法来通知观察者
// 小明订阅天气台
station.Subscribe(user);
// 天气台发布天气
station.PublishWeather("晴天");
station.PublishWeather("多云转雨");
// 天气台结束预报
station.EndWeather();
}
}