Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пак Новакова + / Раздел_1.Ч1_3-1_4.СоловьёвЯрославцева (EF и изучение паттернов).docx
Скачиваний:
84
Добавлен:
03.06.2014
Размер:
719.63 Кб
Скачать

Ход лабораторной работы Упражнение 1 - паттерн наблюдатель

  1. По частям кода из пунктов заданий создаём исходный код.

  2. Далее занимаемся реализацией программы собранного кода.

  3. Необходимые интерфейсы для работы паттерна:

  1. Интерфейс ISubject

interface ISubject

{

void RegisterObserver(IObserver o);

void RemoveObserver(IObserver o);

void NotifyObservers();

}

  1. Интерфейс IObserver

interface IObserver

{

void Update(float temp, float humidity, float pressure);

}

  1. Интерфейс IDisplay

interface IDisplay

{

void Display(); }

  1. Создали класс WheatherData, отвечающий за оповещение клиентов об изменении параметров погоды. Класс реализует интерфейсISubject:

class WeatherData : ISubject

{

private ArrayList observers;

private float temp;

private float humidity;

private float pressure;

public WeatherData()

{

observers = new ArrayList();

}

public void RegisterObserver(IObserver o)

{

observers.Add(o);

}

public void RemoveObserver(IObserver o)

{

observers.Remove(o);

}

public void NotifyObservers()

{

foreach (IObserver o in observers)

{

o.Update(temp, humidity, pressure);

}}

public void MeasurementChange()

{

NotifyObservers();}

public void SetMeasurement(float t, float h, float p)

{

this.temp = t;

this.humidity = h;

this.pressure = p;

MeasurementChange();

}}

  1. После реализации оповещение приступаем к созданию клиентов. Создали три различных класса клиентов. Все они будут реализовывать интерфейсы IObserver, для наблюдения за станцией и интерфейс IDisplay, для демонстрации своей работы:

Класс ConditionDisplay

class ConditionsDisplay : IObserver, IDisplay

{

private float temp;

private float humidity;

private float pressure;

private ISubject data;

public ConditionsDisplay(ISubject d)

{

this.data = d;

d.RegisterObserver(this);

}

public void Update(float temp, float humidity, float pressure)

{

this.temp = temp;

this.humidity = humidity;

this.pressure = pressure;

Display();}

public void Display()

{

Console.WriteLine("I first observer - Current condition display");

Console.WriteLine("Curent condition: t = " + temp + " h = " + humidity + " p = " + pressure);

Console.WriteLine();

}

}

Класс MobilePhone

class MobilePhone : IObserver, IDisplay

{

private float temp;

private ISubject data;

public MobilePhone(ISubject d)

{

this.data = d;

d.RegisterObserver(this); }

public void Update(float temp, float humidity, float pressure)

{

this.temp = temp;

Display();}

public void Display()

{

Console.WriteLine("I second observer - MobilePhone");

Console.WriteLine("Current t = " + temp);

Console.WriteLine();

} }

Класс StaticticsDisplay

class StatisticsDisplay : IObserver, IDisplay

{

private float avgTemp;

private List<float> allTemp;

private ISubject data;

public StatisticsDisplay(ISubject d)

{

this.data = d;

d.RegisterObserver(this);

allTemp = new List<float>();

}

public void Update(float temp, float humidity, float pressure)

{

CalcAvgTemp(temp);

Display();

}

public void Display()

{

Console.WriteLine("I third observer - Average Statictisc Display");

Console.WriteLine("Average t = " + avgTemp);

Console.WriteLine();

}

private void CalcAvgTemp(float t)

{

allTemp.Add(t);

avgTemp = allTemp.Average();

}

}

  1. В итоге получаем:

{

static void Main(string[] args)

{

WeatherData wd = new WeatherData();

ConditionsDisplay current = new ConditionsDisplay(wd);

MobilePhone phone = new MobilePhone(wd);

StatisticsDisplay stat = new StatisticsDisplay(wd);

wd.SetMeasurement(29f, 65f, 30.4f);

wd.SetMeasurement(29.4f, 70f, 31.2f);

wd.RemoveObserver(stat);

wd.SetMeasurement(31f, 75f, 33.3f);

Console.Read();} }

Результат работы программы:

Рис.6. Результаты работы паттерна наблюдатель

Итоги:

убедились в удобстве использования паттерна Наблюдатель на практике при создание сложных архитектур. Также использование паттерна позволяет снизить число связей между объектами и способствует простоте расширения кода.