Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Void FireConnectEvent (object sender, EventArgs args)

{

SourceEventArgs e= (SourceEventArgs) args;

for (int k=0; k<e.s,Length; k++)

switch (e.s [k])

{

case"Russla": // строка Russia данных события

Console.WriteLine ("Russia - Россия");

break;

case"Greece": // строка Greece данных события

Console.WriteLine ("Greece - Греция");

break;

default: // строка данных события,

// не совпадающая со строками Russia и Greece

Console.WriteLine ("Don't know - Не знаю");

break;

>

>

>

class Test

{

static void Main ( )

{

Source sSour= new Source ( ); // Создать источник

Sink sSink = new Sink (sSour); // Создать приёмник

// Генерировать события

string [ ] st={"Russia", "Greece", "Russia", "France");

sSour.FireSourceEvent (st);

>

/>*

Result:

Russia - Россия

Greece - Греция

Russia - Россия

Don't know - Не знаю

*!

В программе примера 8.3.6 исключено описание нашего делегата delEvSourceHandler,

применённого в примере 8.3.5. Вместо него использован стандарт-

ный делегат EventHandler. Это отразилось на программе: иначе объявлено

событие evSource, список параметров обработчика FireConnectEvent соответ-

ствует делегату EventHandler, в теле обработчика пришлось объявить ссылку

на класс SourceEventArgs данных события и привести к его типу тип аргу-

мента args. Фирма Microsoft рекомендует предпочтительное применение де-

легата EventHandler, и мы будем также его использовать.

8.4. Уведомления и события в Java

8.4.1. Уведомления в Java

Появившись ранее языка C#, язык Java впервые ввел делегирование

функций, которое, например, реализовано в механизме уведомления. Уведо-

мить некоторый объект в Java - значит послать ему сообщение (событие,

уведомление), выполнив предопределённые функции setChanged () и notifyObservers(),

на которое среагирует предопределенный обработчик update()

этого объекта. При этом, конечно, можно передать и данные.

При уведомлении выделяют два объекта - наблюдаемый объект (observable

object) и объект-обозреватель (observer). Наблюдаемый объект мо-

жет послать уведомление объекту-обозревателю, выступая в качестве объек-

та-источника события. Так что, в общем случае, можно представить объект-

обозреватель как некий надзиратель над множеством наблюдаемых объектов,

которые при необходимости уведомляют его об их изменениях. И он на каж-

дое уведомление реагирует, выступая в качестве объекта-приёмника собы-

тий.

Итак, если сопоставить это уведомление языка Java с соответствующим де-

легированием языка C#, то наблюдаемым объектам языка Java соответствуют

источники событий (издатели) языка C#, а обозревателям языка Java - при-

ёмники (подписчики) языка C#. Один или несколько обозревателей языка

Java могут наблюдать за одним или несколькими наблюдаемыми объектами.

Вспомним, в языке C# также один или несколько приёмников могут подпи-

саться на события одного или нескольких источников.

Специальный класс Observable и интерфейс Observer языка Java по-

зволяют создать наблюдаемые объекты и обозреватели.

Наблюдаемый объект, класс которого должен наследовать класс Observable,

генерируют событие к обозревателю, на которое реагирует предо-

пределённая функция update() этого обозревателя, являющаяся обработчиком

этого события. Генерирование события (уведомление) осуществляется в на-

блюдаемом объекте посредством вызова предопределённых функций

^etChanged () и notifyObservers(), при этом единственный аргумент функции

notifyObservers() передаётся обозревателю как второй аргумент функции update()

этого обозревателя. В качестве второго аргумента функции update()

может использоваться только объект. Итак, создав специальный объект дан-

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

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

J io существу, здесь осуществляется делегирование функции updatc(). Но в

огл"*:ии от язык? C&, и к-отпппм я в н о применяется объект делегата, о языке

Jova явно объект делегата не применяется.

Итак, если возникла необходимость уведомить некоторый объект (не-

которые объекты) об изменениях в данном объекте, то следует наследовать

класс уведомляемого объекта (обозревателя) из интерфейса Observer, а

класс уведомляющего объекта (наблюдаемого объекта) из класса ObservabIe.

Затем требуется подписать обозреватель, воспользовавшись функцией adilObserver().

Теперь требуемая связь установлена, и можно уверенно пользо-

ваться функциями setChanged () и notifyObservers() наблюдаемого объекта

для уведомления, то есть вызова обработчика update() подписавшегося обо-

зревателя.

В наблюдаемом объекте класса, наследующего класс Observable, можно вос-

пользоваться следующими функциями класса Observable:

void addObserver (Observer obs) - добавить в список объектов, обозревающих

данный наблюдаемый объект, объект obs обозревателя (подписать

на данный наблюдаемый объект указанный объект obs обозревателя).

int countObservers () - возвратить число обозревателей данного наблюдаемого

объекта.

v o i d deleteObserver (Observer obs) - удалить из списка объектов, обозревающих

данный наблюдаемый объект, объект obs обозревателя.

void deleteObservers () - удалить все объекты из списка объектов, обозреваю-

щих данный наблюдаемый объект (обнулить список подписчиков).

boolean hasChanged () - возвратить значение true, если данный наблюдаемый

объект был изменён (обозреватели уведомляются об изменении в

данном наблюдаемом объекте).

orotected void clearChange() - изменить состояние данного наблюдаемого объ-

екта, при котором будут игнорироваться уведомления об изменениях в

нём с помощью функции hasChanged ().