怪奇物语

怪奇物语

首页 新随笔 联系 管理

观察者和被观察者,订阅者和发布者


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();
    }
}


posted on 2025-06-13 08:00  超级无敌美少男战士  阅读(14)  评论(0)    收藏  举报