Observer Pattern

//-----OBSERVER PATTERN-----//

MainFile.cs

using System;

namespace Pattern_Weather
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("-----Push-----");
            Push.WeatherData wd1 = new Push.WeatherData();
            Push.StaticDisplay sd1 = new Push.StaticDisplay(wd1);
            Push.GraphicDisplay dd1 = new Push.GraphicDisplay(wd1);
            wd1.SetMeasurements(3, 2, 5);
            wd1.SetMeasurements(1, 2, 3);
            wd1.SetMeasurements(2, 3, 4);

            Console.WriteLine("-----Pull-----");
            Pull.WeatherData wd = new Pull.WeatherData();
            Pull.StaticDisplay sd = new Pull.StaticDisplay(wd);
            Pull.GraphicDisplay dd = new Pull.GraphicDisplay(wd);
            wd.SetMeasurements(3, 2, 5);
            wd.SetMeasurements(1, 2, 3);
            wd.SetMeasurements(2, 3, 4);
        }
    }
}

PullMethod.cs

using System;
using System.Collections;

namespace Pattern_Weather.Pull
{
    #region Interfaces

    public interface ISubject
    {
        void RegisterObject(IObserver obj);
        void UnRegisterObject(IObserver obj);
        void NotifyObserver();
        void SetChanged();
        float GetTemp();
        float GetHumidity();
        float GetPressure();
    }

    public interface IObserver
    {
        void Update(ISubject subject);
    }

    public interface IDisplay
    {
        void Display();
    }

    #endregion

    public class WeatherData : ISubject
    {
        ArrayList observers;
        float temp = 1;
        float humidity = 2;
        float pressure = 3;
        bool changed = false;

        public WeatherData()
        {
            observers = new ArrayList();
        }

        #region ISubject Members

        public void RegisterObject(IObserver obj)
        {
            observers.Add(obj);
        }

        public void UnRegisterObject(IObserver obj)
        {
            int i = observers.IndexOf(obj);
            if (i >= 0) observers.RemoveAt(i);
        }

        public void SetChanged()
        {
            changed = true;
        }

        public void NotifyObserver()
        {
            if (changed)
            {
                foreach (IObserver obj in observers)
                {
                    obj.Update(this);
                }
            }
        }

        #endregion

        public void MeasurementChanged()
        {
            SetChanged();
            NotifyObserver();
        }

        public void SetMeasurements(float temp, float humidity, float pressure)
        {
            this.temp = temp;
            this.humidity = humidity;
            this.pressure = pressure;
            MeasurementChanged();
        }

        public float GetTemp()
        {
            return this.temp;
        }

        public float GetHumidity()
        {
            return this.humidity;
        }

        public float GetPressure()
        {
            return this.pressure;
        }

    }

    public class StaticDisplay : IObserver, IDisplay
    {
        float temp;
        float humidity;
        float pressure;
        private ISubject weatherData;

        public StaticDisplay(ISubject obj)
        {
            weatherData = obj;
            weatherData.RegisterObject(this);
        }

        #region IDisplay Members
        public void Display()
        {
            Console.WriteLine("Display from :{0}, Temp: {1}, Humidity: {2}, Pressure: {3}", "StaticDisplay", temp, humidity, pressure);
        }
        #endregion

        #region IObserver Members
        public void Update(ISubject subject)
        {
            weatherData = (WeatherData)subject;
            this.temp = weatherData.GetTemp();
            this.humidity = weatherData.GetHumidity();
            this.pressure = weatherData.GetPressure();
            Display();
        }
        #endregion
    }

    public class GraphicDisplay : IObserver, IDisplay
    {
        float temp;
        float humidity;
        float pressure;
        private ISubject weatherData;

        public GraphicDisplay(ISubject obj)
        {
            weatherData = obj;
            weatherData.RegisterObject(this);
        }

        #region IObserver Members
        public void Update(ISubject subject)
        {
            weatherData = (WeatherData)subject;
            this.temp = weatherData.GetTemp();
            this.humidity = weatherData.GetHumidity();
            this.pressure = weatherData.GetPressure();
            Display();
        }
        #endregion

        #region IDisplay Members
        public void Display()
        {
            Console.WriteLine("Display from :{0}, Temp: {1}, Humidity: {2}, Pressure: {3}", "GraphicDisplays", temp, humidity, pressure);
        }
        #endregion
    }
}

PushMethod.cs

using System;
using System.Collections;

namespace Pattern_Weather.Push
{
    public class WeatherData : ISubject
    {
        ArrayList observers;
        float temp = 1;
        float humidity = 2;
        float pressure = 3;

        public WeatherData()
        {
            observers = new ArrayList();
        }

        #region ISubject Members

        public void NotifyObject()
        {
            foreach (IObserver obj in observers)
            {
                obj.Update(this.temp, this.humidity, this.pressure);
            }
        }

        public void RegisterObject(IObserver obj)
        {
            observers.Add(obj);
        }

        public void UnRegisterObject(IObserver obj)
        {
            int i = observers.IndexOf(obj);
            if (i >= 0) observers.RemoveAt(i);
        }

        #endregion

        public void MeasurementChanged()
        {
            NotifyObject();
        }

        public void SetMeasurements(float temp, float humidity, float pressure)
        {
            this.temp = temp;
            this.humidity = humidity;
            this.pressure = pressure;
            MeasurementChanged();
        }
    }

    public class StaticDisplay : IObserver, IDisplay
    {
        float temp;
        float humidity;
        float pressure;
        private ISubject weatherData;

        public StaticDisplay(ISubject obj)
        {
            weatherData = obj;
            weatherData.RegisterObject(this);
        }

        #region IObserver Members

        public void Update(float temp, float humidity, float pressure)
        {
            this.temp = temp;
            this.humidity = humidity;
            this.pressure = pressure;
            Display();
        }

        #endregion

        #region IDisplay Members

        public void Display()
        {
            Console.WriteLine("Display from :{0}, Temp: {1}, Humidity: {2}, Pressure: {3}", "StaticDisplay", temp, humidity, pressure);
        }

        #endregion
    }

    public class GraphicDisplay : IObserver, IDisplay
    {
        float temp;
        float humidity;
        float pressure;
        private ISubject weatherData;

        public GraphicDisplay(ISubject obj)
        {
            weatherData = obj;
            weatherData.RegisterObject(this);
        }
        #region IObserver Members

        public void Update(float temp, float humidity, float pressure)
        {
            this.temp = temp;
            this.humidity = humidity;
            this.pressure = pressure;
            Display();
        }

        #endregion

        #region IDisplay Members

        public void Display()
        {
            Console.WriteLine("Display from :{0}, Temp: {1}, Humidity: {2}, Pressure: {3}", "GraphicDisplays", temp, humidity, pressure);
        }

        #endregion
    }

    #region Interfaces

    public interface ISubject
    {
        void NotifyObject();
        void RegisterObject(IObserver obj);
        void UnRegisterObject(IObserver obj);
    }

    public interface IObserver
    {
        void Update(float temp, float humidity, float pressure);
    }

    public interface IDisplay
    {
        void Display();
    }

    #endregion
   
}


Next Recommended Reading Look at Data Bus Pattern