illiden

PatternObserver

Apr 2nd, 2020
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.75 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Events
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             WeatherData weatherData = new WeatherData();
  14.             CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
  15.             HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData);
  16.  
  17.             weatherData.SetMessurements(80, 65, 30.4f);
  18.             Console.WriteLine();
  19.             weatherData.SetMessurements(20, 325, 30.4f);
  20.             Console.WriteLine();
  21.             weatherData.SetMessurements(520, 785, 30.4f);
  22.  
  23.             Console.ReadKey();
  24.         }
  25.     }
  26.  
  27.     class HeatIndexDisplay : IObserver, IDisplayElement
  28.     {
  29.         private float _heatIndex;
  30.         private ISubject _weatherData;
  31.  
  32.         public HeatIndexDisplay(ISubject weatherData)
  33.         {
  34.             _weatherData = weatherData;
  35.             weatherData.registerObserver(this);
  36.         }
  37.         public void Display()
  38.         {
  39.             Console.WriteLine("Ощущается как: " + _heatIndex);
  40.         }
  41.  
  42.         public void Update(float temperature, float humidity, float pressure)
  43.         {
  44.             _heatIndex = -42.379f + 2.04901523f * temperature + 10.14333127f * humidity -
  45.                 0.22475541f * temperature * humidity - 0.00683783f * temperature * temperature -
  46.                 0.5481717f * humidity * humidity + 0.0122874f * temperature * temperature * humidity +
  47.                 0.00085282f * temperature * humidity * humidity - 0.000000199f * temperature * temperature *
  48.                 humidity * humidity;
  49.             Display();
  50.         }
  51.     }
  52.  
  53.     class CurrentConditionsDisplay : IObserver, IDisplayElement
  54.     {
  55.         private float _temperature;
  56.         private float _humidity;
  57.         private ISubject _weatherData;
  58.         public CurrentConditionsDisplay(ISubject weatherData)
  59.         {
  60.             _weatherData = weatherData;
  61.             weatherData.registerObserver(this);
  62.         }
  63.  
  64.         public void Display()
  65.         {
  66.             Console.WriteLine("Текущая погода: \nTemperature: " + _temperature +
  67.                               "\nHumidity: " + _humidity + "%");
  68.         }
  69.  
  70.         public void Update(float temperature, float humidity, float pressure)
  71.         {
  72.             _temperature = temperature;
  73.             _humidity = humidity;
  74.             Display();
  75.         }
  76.     }
  77.  
  78.     interface IObserver
  79.     {
  80.         void Update(float temperature, float humidity, float pressure);
  81.     }
  82.  
  83.     interface ISubject
  84.     {
  85.         void registerObserver(IObserver observer);
  86.         void removeObserver(IObserver observer);
  87.         void notifyObservers();
  88.     }
  89.  
  90.     interface IDisplayElement
  91.     {
  92.         void Display();
  93.     }
  94.  
  95.     class WeatherData : ISubject
  96.     {
  97.         private IObserver[] _observers = new IObserver[0];
  98.         private float _temperature;
  99.         private float _humidity;
  100.         private float _pressure;
  101.  
  102.         public void notifyObservers()
  103.         {
  104.             foreach (var observer in _observers)
  105.             {
  106.                 observer.Update(_temperature, _humidity, _pressure);
  107.             }
  108.         }
  109.  
  110.         public void registerObserver(IObserver observer)
  111.         {
  112.             IObserver[] newObservers = new IObserver[_observers.Length + 1];
  113.             for(int i = 0; i < _observers.Length; i++)
  114.             {
  115.                 newObservers[i] = _observers[i];
  116.             }
  117.             newObservers[newObservers.Length - 1] = observer;
  118.             _observers = newObservers;
  119.         }
  120.  
  121.         public void removeObserver(IObserver observer)
  122.         {
  123.             int indexRemove = 0;
  124.             for (int i = 0; i < _observers.Length; i++)
  125.             {
  126.                 if(_observers[i] == observer)
  127.                 {
  128.                     indexRemove = i;
  129.                 }
  130.             }
  131.  
  132.             IObserver[] newObservers = new IObserver[_observers.Length - 1];
  133.             int index = 0;
  134.             for (int i = 0; i < newObservers.Length; i++)
  135.             {
  136.                 if(index == indexRemove)
  137.                 {
  138.                     index++;
  139.                 }
  140.                 newObservers[i] = _observers[i];
  141.                 index++;
  142.             }
  143.             _observers = newObservers;
  144.         }
  145.  
  146.         public void MessurementChanged()
  147.         {
  148.             notifyObservers();
  149.         }
  150.  
  151.         public void SetMessurements(float temperature, float humidity, float pressure)
  152.         {
  153.             _temperature = temperature;
  154.             _humidity = humidity;
  155.             _pressure = pressure;
  156.             MessurementChanged();
  157.         }
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment