C# IObservable与IObserver通知机制 观察者模式(推式模型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
                C# IObservable与IObserver通知机制 观察者模式(推式模型)             
             */
            WeatherDataPublisher publisher = new WeatherDataPublisher();
            CurrentConditionDisplay currentDisplay = new CurrentConditionDisplay();
            StatisticsConditionDisplay statisticsDisplay = new StatisticsConditionDisplay();
            //订阅当前天气展示板
            IDisposable currentDisplayUnsubscriber = publisher.Subscribe(currentDisplay);
            //订阅气温统计展示板
            IDisposable statisticsDisplayUnsubscriber = publisher.Subscribe(statisticsDisplay);
 
            for (int i = 0; ; i++)
            {
                WeatherData weatherData = new WeatherData();
                Console.WriteLine("请输入温度,湿度,压力");
                string input = Console.ReadLine();
                var array = input.Split(',');
                weatherData.temperature = array[0];
                weatherData.humility = array[1];
                weatherData.pressure = array[2];
                Console.WriteLine("");
                //将输入的新的天气数据传给天气数据发布器
                publisher.ReciveNewData(weatherData);
                Console.WriteLine("=============================");
            }
        }
    }
 
    /// <summary>
    /// WeatherData类包含气温,湿度,气压等属性。
    /// </summary>
    class WeatherData
    {
        /// <summary>
        /// 气温
        /// </summary>
        public string temperature { get; set; }
        /// <summary>
        /// 湿度
        /// </summary>
        public string humility { get; set; }
        /// <summary>
        /// 气压
        /// </summary>
        public string pressure { get; set; }
    }
 
    /// <summary>
    /// WeatherDataPublisher类实现了IObservable接口,实现了Subscribe订阅方法。
    /// </summary>
    class WeatherDataPublisher : IObservable<WeatherData>
    {
        List<IObserver<WeatherData>> observers = new List<IObserver<WeatherData>>();
 
        /// <summary>
        /// 订阅主题,将观察者添加到列表中
        /// </summary>
        /// <param name="observer"></param>
        /// <returns></returns>
        public IDisposable Subscribe(IObserver<WeatherData> observer)
        {
            observers.Add(observer);
            return new Unsubscribe(this.observers, observer);
        }
 
        /// <summary>
        /// 取消订阅类
        /// </summary>
        private class Unsubscribe : IDisposable
        {
            List<IObserver<WeatherData>> observers;
            IObserver<WeatherData> observer;
            public Unsubscribe(List<IObserver<WeatherData>> observers
            , IObserver<WeatherData> observer)
            {
                this.observer = observer;
                this.observers = observers;
            }
 
            public void Dispose()
            {
                if (this.observers != null)
                {
                    this.observers.Remove(observer);
                }
            }
        }
 
        /// <summary>
        /// 通知已订阅的观察者
        /// </summary>
        /// <param name="weatherData"></param>
        private void Notify(WeatherData weatherData)
        {
            foreach (var observer in observers)
            {
                observer.OnNext(weatherData);
            }
        }
 
        /// <summary>
        /// 接收最新的天气数据
        /// </summary>
        /// <param name="weatherData"></param>
        public void ReciveNewData(WeatherData weatherData)
        {
            Notify(weatherData);
        }
    }
 
    /// <summary>
    /// 抽象类WeatherDisplayBase实现了IObserver接口,所有的天气展示板(观察者)继承这个抽象类,
    /// 需实现OnNext方法,即接收到新数据推送后要进行的数据处理展示工作,并且可重写OnCompleted,OnError方法。
    /// </summary>
    abstract class WeatherDisplayBase : IObserver<WeatherData>
    {
        public virtual void OnCompleted()
        {
        }
        public virtual void OnError(Exception error)
        {
        }
        public abstract void OnNext(WeatherData value);
    }
 
    /// <summary>
    /// CurrentConditionDisplay类为当前天气状况展示板,继承WeatherDisplayBase抽象类,展示最新的天气数据。
    /// </summary>
    class CurrentConditionDisplay : WeatherDisplayBase
    {
        public override void OnNext(WeatherData value)
        {
            Console.WriteLine("------------------");
            Console.WriteLine("当前天气状况板");
            Console.WriteLine(string.Format("温度:{0}
湿度:{1}
气压:{2}",
                value.temperature, value.humility, value.pressure));
        }
    }
 
    /// <summary>
    /// StatisticsConditionDisplay类为气温统计展示板,继承WeatherDisplayBase抽象类,展示历史最高温度,最低温度,平均温度。
    /// </summary>
    class StatisticsConditionDisplay : WeatherDisplayBase
    {
        List<float> temperatures = new List<float>();
        public override void OnNext(WeatherData value)
        {
            float temperature;
            if (float.TryParse(value.temperature, out temperature))
            {
                temperatures.Add(temperature);
            }
            Console.WriteLine("------------------");
            Console.WriteLine("温度统计板");
            Console.WriteLine(string.Format("平均温度:{0}
最高温度:{1}
最低温度:{2}",
                temperatures.Average(), temperatures.Max(), temperatures.Min()));
        }
    }
}

MSCL超级工具类库
基于C#开发的超强工具类,包含数据库操作,字符串处理,文件或者文件夹处理
网络请求,缓存处理,数据容器等上百个常用工具类封装,附带调用示例和参数说明,
提供CHM详细文档,上百个生产环境使用,稳定高效,简单易用。
真正做到“工具在手,一切尽有”,让你大幅度的提高编程效率,提高编程水平。
联系QQ:7400799(请备注 "MSCL")

===============================================

重要压缩文件忘记解压密码?网上下载rar/zip/7z等压缩文件,需要密码?
====极速解密助手,支持支持RAR/ZIP/7Z等多种压缩文档解密======
★ 解密不超过24小时,跟密码复杂程度相关
★ 解密成功后再收费,无套路
★ 解密成功后自动删除原件,无后顾之忧
联系QQ:7400799(请备注 "文件解密")

==============================================

Magic.Orm已在数百个成熟项目中应用,是比较完善的ORM框架(基于C#开发)。开发过程中参考了NBear与MySoft,吸取了其中的一些精华,加入新思想,
后期参考EF的Lambda语法进行大量扩展。

为什么选择Magic.Orm?

  • 上手简单,0学习成本。使用方便,按照sql书写习惯编写C#.NET代码。功能强大。
  • 高性能,接近手写Sql。
  • 体积小(不到200kb,仅一个dll)。
  • 完美支持Sql Server(2000至最新版),MySql,Oracle,Access,Sqlite等数据库。
  • 支持大量Lambda表达式写法。
  • 不需要像NHibernate的XML配置,不需要像EF的各种数据库连接驱动,集成简单。

购买源码 请联系QQ:7400799(请备注 "ORM")

原文地址:https://www.cnblogs.com/smartsmile/p/14415963.html