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

Назначение паттерна Observer

  • Паттерн Observer определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически.

  • Паттерн Observer инкапсулирует главный (независимый) компонент в абстракцию Subject и изменяемые (зависимые) компоненты в иерархию Observer.

  • Паттерн Observer определяет часть "View" в модели Model-View-Controller (MVC) .

Решаемая проблема

Имеется система, состоящая из множества взаимодействующих классов. При этом взаимодействующие объекты должны находиться в согласованных состояниях. Вы хотите избежать монолитности такой системы, сделав классы слабо связанными (или повторно используемыми).

  1. ПАТТЕРН ОДИНОЧКА (Singleton)

Паттерн одиночка гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. На рисунке 2 представлен класс с паттерном одиночкой.

Рисунок – 2. UML-диаграмма классов паттерна Singleton

Паттерн Singleton часто называют усовершенствованной глобальной переменной.

1. Метод GetInstance() объявлен статическим, что позволяет легко вызывать его в любом месте с использованием синтаксиса Singleton.GetInstance(). Этот способ ничуть не сложнее обращения к глобальной переменной, но он обладает дополнительными преимуществами – такими, как отложенная инициализация.

2. Переменная класса UniqueInstance содержит один и только один экземпляр Singleton.

3. Паттерн Одиночка реализуется классом общего назначения, который обладает собственными данными и методами.

Назначение паттерна Singleton

Часто в системе могут существовать сущности только в единственном экземпляре, например, система ведения системного журнала сообщений или драйвер дисплея. В таких случаях необходимо уметь создавать единственный экземпляр некоторого типа, предоставлять к нему доступ извне и запрещать создание нескольких экземпляров того же типа.

Паттерн Singleton предоставляет такие возможности.

Описание паттерна Singleton

Архитектура паттерна Singleton основана на идее использования глобальной переменной, имеющей следующие важные свойства:

  1. Такая переменная доступна всегда. Время жизни глобальной переменной - от запуска программы до ее завершения.

  2. Предоставляет глобальный доступ, то есть, такая переменная может быть доступна из любой части программы.

Однако, использовать глобальную переменную некоторого типа непосредственно невозможно, так как существует проблема обеспечения единственности экземпляра, а именно, возможно создание нескольких переменных того же самого типа (например, стековых).

Для решения этой проблемы паттерн Singleton возлагает контроль над созданием единственного объекта на сам класс. Доступ к этому объекту осуществляется через статическую функцию-член класса, которая возвращает указатель или ссылку на него. Этот объект будет создан только при первом обращении к методу, а все последующие вызовы просто возвращают его адрес. Для обеспечения уникальности объекта, конструкторы и оператор присваивания объявляются закрытыми.

  1. ПАТТЕРН ИНТЕРФЕЙС.

1. Есть программа, где создан класс DUCK (утка) со следующими методами – quak(крякать), swim(плавать) и display(показать) и два наследуемых класса – MALLARDDUCK(дикая утка) и REDHEADDUCK (красноголовая утка), которые соответственно наследуют все методы класса DUCK, диаграмма классов данной программы представлена на рисунке 3.

Рисунок -3

2. Представим, что в класс DUCK добавили новый метод fly (летать) (Рисунок 2).

Рисунок -4

  1. А теперь, представим, что нам необходимо в программу добавить новый класс (новый тип уток) RUBBERDUCK (резиновая утка) (Рисунок 3). Резиновая утка не летает, поэтому метод fly() придется переопределить.

Рисунок 5

  1. А если у нас будет тысяча видов уток и у каждой свой набор свойств, то нам придется переопределять для каждого класса какой-то или какие-то методы. Для этого существует следующий паттерн, который поможет избежать этого.

Задание:

Упражнение 1 - ПАТТЕРН НАБЛЮДАТЕЛЬ

  1. Создайте новый класс Simulator, который будет отвечать за создание элемента (числа)

  2. Создайте интерфейс IObserver и класс Observer.

  3. Создайте класс Subject:

  4. В метод Main скопируйте следующий код:

static void Main(string[] args)

{

Subject subject = new Subject();

Observer Observer = new Observer(subject, "Center", "\t\t");

Observer observer2 = new Observer(subject, "Right", "\t\t\t\t");

subject.Go();

Console.Read();

}

  1. В результате получилась программа, которая выводит на консоль переменную и

оповещает двух наблюдателей, о том, что переменная изменилась и наблюдатели в свою очередь выводят на консоль эту переменную.

  1. Создайте программу, которая бы показывала прогноз погоды с параметрами

(температура, влажность воздуха, давление и т.п.) и имела бы трех наблюдателей.

Упражнение 2 - ПАТТЕРН ОДИНОЧКА

  1. Создайте новый класс Singleton, реализующий паттерн Одиночку:

  2. Создайте 2 класса FirstClass и SecondClass, методы которых возвращают статическую переменную name класса Singleton:

  3. В метод Main скопируйте следующий код:

static void Main(string[] args)

{

FirstClass first = new FirstClass();

SecondClass second = new SecondClass();

Console.WriteLine("Singleton name in firstclass: " + first.getName());

Console.WriteLine("Singleton name in secondtclass: " + second.getName());

Console.Read();

}

  1. В результате на консоль должно быть выведено одно и то же имя статической

переменной класса Singleton.

  1. Создайте 2 класса, реализующих последовательный вывод на экран чисел от 0 до 10 (статическая переменная класса = 0 и при каждом создании экземпляра

класса ее значение увеличивается на 1). В одном из них реализуйте паттерн Одиночка. Выведите результаты работы двух классов на консоль. Проанализируйте результаты.

Упражнение 3 - ПАТТЕРН ИНТЕРФЕЙС

  1. Создайте новый класс “Duck.cs” и новый класс “MallardDuck.cs”.

  2. Создайте интерфейс “FlyBehavior .cs” и два новых класса “FlyWithWings.cs”

“FlyNoWay.cs”.

  1. Создайте интерфейс “QuakBehavior .cs” и два новых класса “Quak.cs” “Silence.cs”.

  2. В метод Main вставьте следующий код:

static void Main(string[] args)

{

Duck mallard = new MallardDuck();

mallard.performQuack();

mallard.performFly();

Duck wood = new WoodDuck();

wood.performQuack();

wood.performFly();

System.Console.ReadKey();

}

  1. Создайте новый класс, характеризующий новую утку с новыми свойствами,

придумайте интерфейс для нового свойства. Добавьте это свойство к уже

существующим классам уток и выведите результаты на консоль.