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

Import java.Utii.*;

Ц Класс объекта данных события

public class DataDate

<

public String date;

public DataDate (String S)

{date= S;> >

// Интерфейс

public interface DateListener

{

Void DatePerformed (DataDate dd); // Обработчик

>

// Класс источника (наблюдаемого объекта)

class DateSource

{

ArrayList aL; // Ссылка на список

public DateSource ( )

{

aL= new ArrayList (); // Создать объект списка

>

// ДобавиТь объект-приёмник в список

public void addDateListener (DateListener dL)

{

aL.add (dL);

}

// Удалить объект-приёмник из списока

public void removeDateListener (DateListener dL)

{

aL.remove (dL);

>

// Сгенерировать событие

public vold performedDate ()

<

Date d= new Date ( ); // Создать объект даты

System.out.println ("The event happened at" +

d.toLocaleString());

String date= d.toLocaleString ();

DataDate dd= new DataDate (date); // Создать объектданных

// Выполнить подписавшиеся обработчики

for (int i=0; i < aL.size(); i++)

<

// Выбрать текущий объект-приёмник из списка

DateListener m= (DateListener) aL.get(i);

// Выполнить делегированный обработчик

m. DatePerformed (dd);

>

// Класс приёмника события

public class DateRecelver implements DateListener

{

Int n; // Номер объекта-приёмника

public DateReceiver (int N) {n= N;}

// Обработчик

public void DatePerformed(DataDate bD)

{

System.out.println ("Object" + n +

" has just got the event at" + bD.date);

>

public static void main ( )

{

// Создать объект-источник события

DateSource dS= new DateSource();

// Создать первый объект-приёмник события

DateReceiverdRl= new DateRecelver (1);

// Создать второй объект-приёмник события

DateReceiverdR2= new DateRecelver (2);

// Создать третийй объект-приёмник события

DateReceiver dR3= new DateRecelver (3);

// Подписать первый объект-приёмник на событие

dS.addDateLlstener(dRl);

// Подписать второй объект-приёмник на событие

dS.addDateListener (dR2);

// Подписать третий объект-приёмник на событие

dS.addDateListener (dR3);

// Сгенерировать событие

dS.performedDate ();

>

> /*

Result:

The event happened at 05.05.2008 17:18

The object 1 has just got the event at 05.05.2008 17:18

The object 2 has just got the event at 05.05,2008 17:18

The object 3 hasjustgottheeventat05.05.2008 i7:18

*/

Класс DateSource источника события включает объект aL списка класса ArrayList,

Содержимое списка пополняется при каждом вызове функции

addDateListener(). Элементами объекта списка класса ArrayList являются объ-

екты типа Object, то есть объекты корневого класса. Поэтому в список можно

включить (ad()) разнотипные объекты, но при извлечении (get()) объектов из

списка требуется преобразование типа Object к требуемому типу, что и дела-

ется в функции performedDate(). Осуществляется преобразование к типу

DateListener - интерфейсу, из которого обязан наследоваться класс каждого

объекта-приёмника. Таким образом, любой действительный приёмник, на-

следующий интерфейс DateListener, будет и добавляться в список aL, по-

скольку параметром функции addDateListener() является интерфейсная ссыл-

ка типа DateListener, и удаляться из списка, поскольку параметром функции

removeDateListener() является интерфейсная ссылка типа DateListener, и из-

влекаться из списка по той же интерфейсной ссылке типа DateListener.

Класс DateReceiver каждого объекта-приёмника, как и надлежит, на-

следует интерфейс DateListener и реализует обработчик DatePerformed(), на-

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

объект данных события типа DataDate, извлекая из него для выдачи на кон-

соль строку с датой генерирования события.

Функция main() класса DateReceiver создаёт объект dS источника собы-

тия и три объекта-приёмника, включает эти объекты в список aL объекта-

источника, воспользовавшись функцией addDateListener(). Затем генерирует-

ся событие при вызове функции performedDate() объекта-источника.

Если событие широко используется, то для упрощения разработки

классов источника и приёмника этого события создают специальный класс

события, инкапсулирующий список и предлагающий предопределённые

функции, оперирующие с этим списком. С этим событием связывают кон-

кретный интерфейс и класс данных события.

Пример 8.4.2.2 иллюстрирует такие классы и интерфейс применительно к со-

бытию Happen, объект данных которого несёт информацию о причине гене-

рирования события, дате и времени его генерирования. Причина what собы-

тия является целым числом, с которым можно связать любой факт.

Пример 8.4.2.2. Реализация класса и интерфейса события

///////////////

// Java и J#

package cjExample_8_4_2_2;

importJava.utll.*;

// Класс данных события

class HappenData

{

String date; // Дата

int what; // Что произошло

public HappenData (String D, int W)

<date= D; what= W;}

>

// Интерфейс

interface HappenListener

{

void performedHappen (HappenData hD);

>

// Класс события

class Happen

<

ArrayLlst aL; // Ссылка на список

public Happen ()

{

aL= new ArrayList (); // Создать список

>

// Добавить приёмник в список

public vold addHappenListener (HappenListener hL)

{

aL.add (hL);

>

// Удалить приёмник из списока

public vold removeHappenListener (HappenListener hL)

{

aL.remove (hL);

>

// Сгенерировать событие

public vold HappenWhat (lnt What)

{

/ / Получить объектдаты

Date d= new Date ( );

// Получить текущую дату и время

String s= d.toLocaleString ();

// Создать объект данных события

HappenData hD= new HappenData (s, What);

// Выполнить событие

for (int k=0; k < aL.size(); k++)

{

// Выбрать приёмник из списка

HappenListener h= (HappenListener) aL.get(k);

// Выполнить обработчик выбранного приёмника

h.performedHappen (hD);

>

>

>

// Класс источника события

class HappenSource extends Happen

<

lnt num; // Номер объекта источника события

// Сгенерировать событие

public void HappenWhat (int What}

{

super.HappenWhat (What);

>

>

// Класс приёмника события

public class HappenReceiver implements HappenListener

{