Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекции C# for print fineprint.docx
Скачиваний:
340
Добавлен:
24.02.2016
Размер:
523 Кб
Скачать
☆

2. Делегат как оповещатель. Паттерн «наблюдатель»

Паттерн – шаблон проектирования (одна и та жа схема организации и взаимодействия объектов в различных ситуациях). Существует несколько паттернов программирования, одним из которых является «паттерн наблюдатель».

Объект, называемый источникомпри изменении своего состояния, может представлять интерес для других объектов, по этому он должен посылать им извещение о том, что у него, что-то произошло. Такие объекты, получив извещение должны обновить своё состояние, что бы синхронизировать своё состояние с объектом источником. Такие объекты называютсянаблюдателями.Наблюдатель1

Наблюдатели синхронизировали свое состояние с источником

Наблюдатель2

Источник

…

Наблюдатель n

Изменил состояние – послал всем наблюдателям извещение

Пример делегата для оповещения наблюдателей

namespace ConsoleApplication1

{

delegate void MyDelegate(object o);

class Источник

{

//Делегат-поле класса

MyDelegate del;

public void Reg(MyDelegate d)

//добавление делегатов

{ del += d; }

//событие, возникающее внутри источника – посылка наблюдателям извещения

public void Event()

{ Console.WriteLine("Событие создано!");

if (del != null) //если в делегате есть функция

del(this);//ВЫПОЛНИТЬ метод, “привязанный” к делегату

}

//удаление делегатов из списка зарегистрированных

public void UnReg(MyDelegate d)

{ del -= d; }

}

class Наблюдатель1

{

//”подходящий” делегту метод

public void Do_Event_1(object o)

{Console.WriteLine("ВИЖУ, что произошло событие!!!"); }

}

class Наблюдатель2

{

public static void Do_Event_2(object o)

{ Console.WriteLine("Я тоже ВИЖУ, что произошло событие!!!"); }

}

class Program

{static void Main(string[] args)

{ Источник A = new Источник();

Наблюдатель1 B = new Наблюдатель1();

Наблюдатель1 C = new Наблюдатель1();

//зарегистрировали делегат (создали его экземпляр), “привязали” к нему метод

A.Reg(new MyDelegate(B.Do_Event_1));

A.Reg(new MyDelegate(С.Do_Event_1));

//то же самое, только для СТАТИЧЕСКОГО метода

A.Reg(new MyDelegate(Наблюдатель2.Do_Event_2));

A.Event();

//убрали одного наблюдателя для источника

A.UnReg(new MyDelegate(B.Do_Event_1));

A.Event();

Console.ReadKey(); } }}

3. Делегат как процедура обратного вызова

Так как делегат является классом, его можно передавать в методы в качестве параметра. Это называется функциональной параметризацией. Функциональная параметризация применяется для создания универсальных методов (например, метод вывода таблицы значений функции) и возможности обеспечения обратного вызова.

Обратный вызов (callback) представляет собой вызов функции, передаваемой в другую функцию в качестве параметра.

В качестве примера “универсального” метода и демонстрации обратного вызова функции рассмотрим передачу делегата в качестве параметра метода, который выводит на экран таблицу значений функции. В качестве параметров выступают диапазон значений аргумента, шаг его измерений и вид вычисляемой функции (ДЕЛЕГАТ).