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

Void notifyObservers () - уведомить всех обозревателей данного наблюдаемого

объекта вызовом функции update() со вторым аргументом, равным

null, о том, что данные наблюдаемого объекта были изменены. Обо-

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

Void notifyObservers (Object obj) - уведомить всех обозревателей данного на-

блюдаемого объекта вызовом функции update() со вторым передавае-

мым аргументом obj, о том, что он был изменен. То есть объект obj пе-

редаётся из данного наблюдаемого объекта в обозреватели в качестве

второго аргумента функции update() в объектах обозревателей.

protected void setChanged () - вызвать при изменении данного наблюдаемого

объекта (когда объект, инициирующий обращение, изменился)

Интерфейс Observer обозревателя содержит единственную функцию update()

- обработчик уведомлений:.

Void update(Observable observable. Object obj) - эта функция данного объекта

обозревателя вызывается при выполнении функции notifyObservers()

наблюдаемого объекта observable, на который подписан данный объ-

ект обозревателя. Значение аргумента obj пересылается в качестве

аргумента функции notlfyObservers() наблюдаемого объекта.

Функция update() вызывается, когда происходят изменения в наблю-

даемом объекте.

Осознавая важность событий и уведомлений при разработке сложных

программ, рассмотрим разные примеры, поясняющие применение уведомле-

ний в различных ситуациях.

Пример 8.4.1.1. Обозреватель и наблюдаемый объект.

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

// Java и J#

// Наблюдатель и наблюдаемый

Import java.Util.*;

class Watcher implements Observer || Класс обозревателя

<

public void update (Observable obj, Object arg) {

System.out.println ("1= " + ((Integer) arg).intValue ( ));

} >

rlass BeingWatched extends Observable // Класс наблюдаемого объекта

(

public void perform (){

for (int i=0 ;i < 3; 1++) {

setChanged ( );

notifyObservers (new Integer (i));

try{

Thread.sleep (100); >

catch(InterruptedException e){

System.out.println("' perform: sleep' interrupted");

>

>

>

public class OneWatcherOneBeingWatched

{

public static vold main ( )

{

// Создать наблюдаемый объект bW

BelngWatched bW= new BeingWatched ();

// Создать объект w обозревателя

Watcher w= new Watcher ();

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

bW.addObserver (w);

// Инициировать уведомления

bW.perform ( ); >

/>*

Result:

i= 0

i= 1

i= 2

*/

Пример 8.4.1.1 иллюстрирует применение одного наблюдаемого объек-

та bW класса BeingWatched и одного обозревателя w класса Watcher.

Класс BeingWatched наблюдаемого объекта, как положено, наследует

класс Observable и включает открытую функцию perform(), при вызове кото-

рой трижды выполняется пара функций setChanged() и notifyObservers(), ко-

торые трижды уведомляют подписавшегося обозревателя.

Класс Watcher обозревателя наследует, как надлежит, интерфейс Observer

и включает функцию update() - обработчик уведомления.

Функция main() класса OneWatcherOneBeingWatched создаёт наблю-

даемый объект bW и объект w обозревателя. Затем функция addObserver()

подписывает обозреватель w. Теперь, вызвав функцию perform(), наблюдае-

мый объект трижды уведомляет обозревателя. При этом наблюдаемый объ-

ект через аргумент функции notifyObservers() передаёт объект-оболочку

класса Integer, инкапсулирующую значение целочисленной переменной i,

значения которой извлекаются обозревателем из второго параметра arg

функции updateO.

В примере 8.4.1.2 применяются два обозревателя и один наблюдаемый

объект.

Пример 8.4.1.2. Два обозревателя и один наблюдаемый объект.

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

// Java и 3#