第二章 观察者模式1

观察者模式

观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象的状态改变时,它的所有依赖者都会收到通知并且自动更新。

实现方法

观察的对象为可观察者,要被通知的对象称为观察者。
观察者都实现同一个接口,里面有一个方法用来被可观察者调用,实现通知的功能。可观察者实现可被观察的接口,在观察者中调用可观察者接口的方法实现注册,删除观察者等功能。

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 观察者模式
{
    class Program
    {
        static void Main(string[] args)
        {
            WeatherData weatherData=new WeatherData();

            CurrentConditionsDisplay currentDisplay=new CurrentConditionsDisplay(weatherData);
            StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherData);
            ForecastDisplay forecastDisplay=new ForecastDisplay(weatherData);

            // 虚拟数据
            weatherData.SetMeasurements(80,65,30.4f);
            weatherData.SetMeasurements(82, 70, 29.2f);
            weatherData.SetMeasurements(78, 90, 29.2f);

            Console.ReadKey();
        }
    }


    // 观察者接口
    public interface IObserver
    {
        // 更新数据方法
        void Update(float temp,float humidity,float pressure);
    }

    // 观察者目标接口
    public interface ISubject
    {
        // 注册观察者方法
        void RegisterObserver(IObserver o);
        // 移除观察者方法
        void RemoveObserver(IObserver o);
        // 通知方法
        void NotifyObservers();
    }

    // 显示接口
    public interface IDisplayElement
    {
        // 显示方法
        void Display();
    }

    // 观察者的具体目标,实现目标接口
    public class WeatherData:ISubject
    {
        private List<IObserver> _observers; // 观察者列表
        private float _temprature;
        private float _humidity;
        private float _pressure;

        public WeatherData()
        {
            _observers=new List<IObserver>();
        }

        // 注册观察者
        public void RegisterObserver(IObserver o)
        {
            _observers.Add(o);
        }

        // 移除观察者
        public void RemoveObserver(IObserver o)
        {
            if (_observers.Contains(o))
            {
                _observers.Remove(o);
            }
        }

        // 通知观察者值改变,通过调用观察者列表中实现观察者接口的函数
        public void NotifyObservers()
        {
            foreach (var observer in _observers)
            {
                observer.Update(_temprature,_humidity,_pressure);
            }
        }

        // 通知观察者值发生改变
        public void MeasurementsChanged()
        {
           NotifyObservers();
        }

        // 获取实时值并且通知值改变
        public void SetMeasurements(float temperature, float humidity, float pressure)
        {
            _temprature = temperature;
            _humidity = humidity;
            _pressure = pressure;
            MeasurementsChanged();
        }

        // WeatherData 的其它方法
    }

    // 具体的观察者
    public class CurrentConditionsDisplay:IObserver,IDisplayElement
    {
        private float _temprature;
        private float _humidity;
        private ISubject _weatherData;

        // 实例化时传入观察目标实例的接口
        public CurrentConditionsDisplay(ISubject weatherData)
        {
            _weatherData = weatherData;
            _weatherData.RegisterObserver(this);
        }

        // 通过接口方法获得数据
        public void Update(float temp, float humidity, float pressure)
        {
            _temprature = temp;
            _humidity = humidity;
            Display();
        }

        public void Display()
        {
            Console.WriteLine($"Current conditions: {_temprature}F degrees and {_humidity}% humidity");
        }
    }

    public class ForecastDisplay : IObserver, IDisplayElement
    {
        private float _temprature;
        private float _humidity;
        private ISubject _weatherData;

        public ForecastDisplay(ISubject weatherData)
        {
            _weatherData = weatherData;
            _weatherData.RegisterObserver(this);
        }

        public void Update(float temp, float humidity, float pressure)
        {
            _temprature = temp;
            _humidity = humidity;
            Display();
        }

        public void Display()
        {
            Console.WriteLine($"Forecast: {_temprature}F degrees and {_humidity}% humidity");
        }
    }

    public class ThirdPartyDisplay : IObserver, IDisplayElement
    {
        private float _temprature;
        private float _humidity;
        private ISubject _weatherData;

        public ThirdPartyDisplay(ISubject weatherData)
        {
            _weatherData = weatherData;
            _weatherData.RegisterObserver(this);
        }

        public void Update(float temp, float humidity, float pressure)
        {
            _temprature = temp;
            _humidity = humidity;
            Display();
        }

        public void Display()
        {
            Console.WriteLine($"ThirdParty: {_temprature}F degrees and {_humidity}% humidity");
        }
    }

    public class StatisticsDisplay : IObserver, IDisplayElement
    {
        private float _temprature;
        private float _humidity;
        private ISubject _weatherData;

        public StatisticsDisplay(ISubject weatherData)
        {
            _weatherData = weatherData;
            _weatherData.RegisterObserver(this);
        }

        public void Update(float temp, float humidity, float pressure)
        {
            _temprature = temp;
            _humidity = humidity;
            Display();
        }

        public void Display()
        {
            Console.WriteLine($"Statistics: {_temprature}F degrees and {_humidity}% humidity");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值