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

Importjava.Util.*;

class Data // Класс объекта данных уведомления

String s;

public Data (String S) {s= S;>

>

class BeingWatchedWatcher extends Observable implements Observer

{

Int num; // Номер уведомляющего объекта

BeingWatchedWatcher(int N) {num= N;>

public void go ( ) // Уведомить

<

setChanged ( );

notifyObservers (new Data ("BeingWatched "+ num));

}

// Обработать уведомление

public void update (Observable obj, Object arg)

{

System.out.println (((Data) arg).s);

>

>

public class OnelWatcherAndBeingWatched

{

public static void main ( )

i

// Создать первый наблюдаемый объект-обозреватель Ы

BeingWatchedWatcher bl= new BeingWatchedWatcher(l);

// Создать второй наблюдаемый объект-обозреватель b2

BeingWatchedWatcher b2= new BeingWatchedWatchcr(2);

// Подписать обозреватель bl

bl.addObserver(bZ);

// Подписать обозреватель b2

b2.addObserver(bl);

// Уведомить

bl.go();

> b2.go();

/>*

Result:

BeingWatched 1

BeingWatched 2

*/

8.4.2. События в Java

Кроме уведомления, широко используемого как определённый и реко-

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

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

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

наследует этот интерфейс. В отличие от уведомления здесь не требуется ис-

пользовать заранее предопределённый интерфейс, класс, функции и обра-

ботчик. Имя интерфейса и обработчика события могут быть выбраны произ-

вольно. Для подключения объектов-приёмников к объекту-источнику при-

меним функцию вида

public vold add7ypeLlstener (TypeLlstener tL),

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

Здесь 7^peListener - это имя интерфейса, включающего обработчик. Если

придерживаться рекомендаций модели делегирования событий, то жела-

тельно оставить в имени интерфейса слово Listener. Тогда имя интерфейса

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

на нам встретятся в дальнейшем при обработке событий мыши и управляю-

щих элементов, размещённых в прикладном окне приложений.

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

цию для того, чтобы в дальнейшем, создав объект источника, можно было бы

подключить к нему требуемые объекты приёмников.

В соответствии с терминологией язьнса Java объект-приёмник, восприни-

мающий события (или уведомления), называется блоком прослушивания (listener).

Блок прослушивания должен обязательно удовлетворять двум требова-

ниям. Во-первых, он должен бьггь подписан (зарегистрирован) объектом-

источником события. Во-вторых, он обязан реализовать обработчик события.

Таким образом, разрабатывая объект-источник, необходимо разрабо-

тать интерфейс события, включающий обработчик, и класс объекта данных

события. Объект данных события будет сопровождать событие, чтобы пере-

дать обработчику конкретные данные. Класс объекта-приёмника события

(блок прослушивания) должен наследовать этот интерфейс, чтобы реализо-

вать корректно соответствующий обработчик.

И как только что говорилось, объект-источник должен обеспечить воз-

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

ёмников (блоков прослушивания), располагая специальными функциями до-

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

щённый в этом объекте-источнике.

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

просмотра списка объектов приёмников (блоков прослушивания) и выполне-

ния предопределённого интерфейсом обработчика для каждого из них. При

этом в качестве аргумента в эти функции-обработчики передаётся объект со-

бытия.

В примере 8.4.2.1 предсгавлены класс DateSource источника события, класс

DateReceiver приёмника события, интерфейс DateListener и класс DataDate

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

Данным события является строка, содержащая текущую дату и время, полу-

ченные посредством объекта класса Date. Эту строку объект-источник посы-

лает вместе с событием объектам-приёмникам.

Пример 8.4.2.1. Реализация источника и приёмника события

// java и J#

// Один объект-источник (наблюдаемый объект) и

// три объекта-приёмника (наблюдателя),

package cjExample_8_4_2_l;