
- •Часть 1-3
- •2012 Лабораторная работа №3
- •Общие сведения
- •Формализация задачи
- •Упражнение 3 – Добавление в модель хранимой процедуры
- •Часть 1-4
- •2012 Лабораторная работа 4
- •Назначение паттерна Observer
- •Решаемая проблема
- •Назначение паттерна Singleton
- •Описание паттерна Singleton
- •Ход лабораторной работы Упражнение 1 - паттерн наблюдатель
- •Упражнение 2 - паттерн одиночка
- •Упражнение 3 - паттерн интерфейс
Ход лабораторной работы Упражнение 1 - паттерн наблюдатель
По частям кода из пунктов заданий создаём исходный код.
Далее занимаемся реализацией программы собранного кода.
Необходимые интерфейсы для работы паттерна:
Интерфейс ISubject
interface ISubject
{
void RegisterObserver(IObserver o);
void RemoveObserver(IObserver o);
void NotifyObservers();
}
Интерфейс IObserver
interface IObserver
{
void Update(float temp, float humidity, float pressure);
}
Интерфейс IDisplay
interface IDisplay
{
void Display(); }
Создали класс 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();
}}
После реализации оповещение приступаем к созданию клиентов. Создали три различных класса клиентов. Все они будут реализовывать интерфейсы 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();
}
}
В итоге получаем:
{
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. Результаты работы паттерна наблюдатель
Итоги:
убедились в удобстве использования паттерна Наблюдатель на практике при создание сложных архитектур. Также использование паттерна позволяет снизить число связей между объектами и способствует простоте расширения кода.