观察者模式

2019-08-29  本文已影响0人  周末的游戏之旅

观察者模式

观察者模式适用于有多个对象,对象之间存在一对多的依赖关系。
被依赖的对象称为subject,依赖的对象成为Observer,subject通知Observer变化

举例

观察者模式就像顶牛奶业务

  1. 奶站,Subject
  2. 用户,Observer

Subject:登记注册、移除通知


Observer:接收输入


示例

using System;
using System.Collections.Generic;
using System.Text;

namespace Observer
{
    /// <summary>
    /// 观察者接口
    /// </summary>
    interface Observer
    {
        void Update(float mTeperatrue,float mPressure,float mHumidity);
    }

    interface Subject
    {
        void RegisterObserver(Observer observer);
        void RemoveObserver(Observer observer);
        void NotifyObservers();
    }

    class CurrentConditions : Observer
    {
        private float mTeperatrue;
        private float mPressure;
        private float mHumidity;

        //更新本地数据
        public void Update(float mTeperatrue, float mPressure, float mHumidity)
        {
            this.mTeperatrue = mTeperatrue;
            this.mPressure = mPressure;
            this.mHumidity = mHumidity;
            Display();
        }

        //显示本地数据
        public void Display()
        {
            Console.WriteLine("Tody mTeperatrue"+ mTeperatrue);
            Console.WriteLine("Tody mPressure" + mPressure);
            Console.WriteLine("Tody mHumidity" + mHumidity);
        }
    }

    class ForcastConditions : Observer
    {
        private float mTeperatrue;
        private float mPressure;
        private float mHumidity;

        public void Update(float mTeperatrue, float mPressure, float mHumidity)
        {
            this.mTeperatrue = mTeperatrue;
            this.mPressure = mPressure;
            this.mHumidity = mHumidity;
            Display();
        }

        public void Display()
        {
            Random rd = new Random();
            Console.WriteLine("Tomorrow mTeperatrue" + mTeperatrue + rd.Next(1, 10));
            Console.WriteLine("Tomorrow mPressure" + mPressure + rd.Next(1, 10));
            Console.WriteLine("Tomorrow mHumidity" + mHumidity + rd.Next(1, 10));
        }
    }

    class WeatherData:Subject
    {
        private float mTeperatrue;
        private float mPressure;
        private float mHumidity;
        private List<Observer> myObservers;

        public float MTeperatrue { get => mTeperatrue; }
        public float MPressure { get => mPressure; }
        public float MHumidity { get => mHumidity; }

        public WeatherData()
        {
            myObservers = new List<Observer>();
        }

        public void SetData(float mTeperatrue, float mPressure,float mHumidity)
        {
            this.mTeperatrue = mTeperatrue;
            this.mPressure = mPressure;
            this.mHumidity = mHumidity;
            DataChange();
        }

        public void DataChange()
        {
            NotifyObservers();
        }

        public void NotifyObservers()
        {
            for (int i = 0; i < myObservers.Count; i++)
            {
                myObservers[i].Update(MTeperatrue, MPressure, MHumidity);
            }
        }

        public void RegisterObserver(Observer observer)
        {
            myObservers.Add(observer);
        }

        public void RemoveObserver(Observer observer)
        {
            if (myObservers.Contains(observer))
                myObservers.Remove(observer);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            CurrentConditions currentConditions = new CurrentConditions();
            ForcastConditions forcastConditions = new ForcastConditions();
            WeatherData weatherData=new WeatherData();

            weatherData.RegisterObserver(currentConditions);
            weatherData.RegisterObserver(forcastConditions);
            weatherData.SetData(1, 2, 3);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读