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

II Два наблюдателя и один наблюдаемый объект

Importjava.Util.*;

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

public void update (Observable obj, Object arg)

{

System.out.println("Watcherl: f= " + ((Float)arg).floatValue ( ));

>

>

class Watcher2 implements Observer // Класс второго обозревателя

{

public void update (Observable obj, Object arg) \r

System.out.println("Watcher2: f= " + ((Float)arg).floatValue ( ));

>

>

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

{

public void perform ()

{

for (float i=O.OF ;i < 0.3; i= 1+ 0.1F)

{

setChanged ( );

notifyObservers (new Float (i));

try

{

Thread.sleep (100);

>

catch(InterruptedException e)

{

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

>

>

>

>

public class TwoWatchersOneBeingWatched

<

public static void main ( )

{

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

BeingWatched bW= new BeingWatched();

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

Watcherl wl= new Watcherl();

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

Watcher2 w2= new Watcher2();

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

bW.addObserver(wl);

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

bW.addObserver(w2);

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

bW.perform ( );

System.out.print!n("countObservers()= " +

bW.countObserversQ);

/>*

Result:

Watcherl: f= 0.0

Watcher2: f= 0.0

Watcherl: f= 0.1

Watcher2: f= 0.1

Watcherl: f= 0.2

Watcher2: f= 0.2

countObservers()= 2

*/

В примере 8.4.2 два обозревателя wl и w2 наблюдают один наблюдаемый

объект bW. Наблюдаемый объект bW меняет значение числа с плавающей

точкой от значения 0.0F до значения 0.2F с шагом 0.1F и о каждом изменении

уведомляет обоих обозревателей, передавая при этом значение числа. Объек-

ты обозревателей подписаны на уведомления с помощью функции addObserver().

Из результата, выданном в консольное окно, видно, что уведомление

при каждом шаге изменения одновременно поступает к двум подписавшимся

обозревателям. Вызов функции countObservers()) подтверждает, что наблю-

даемый объект bW обозревается двумя обозревателями.

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

уведомлении любой объект, что иллюстрируется в примере 8.4.1.3.

Пример 8.4.1.3. Один обозреватель и два наблюдаемых объекта с объек-

том данных.

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

// Java

// Один наблюдающий и два наблюдаемых

Importjava.Utll,*;

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

{

boolean b;

String s;

public Data (boolean В, String S)

{b= В; s= S;}

>

class Watcher Implements Observer // Класс обозревателя

{

public void update (Observable obj, Object arg)

{

System.out.println (((Data)arg).s + " " + ((Data)arg).b);

>

>

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

{

public void go ( )

{

Data d= new Data (true, "BeingWatchedl");

setChanged ( );

notifyObservers (d);

>

>

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

{

public void go ( )

{

setChanged ( );

notifyObservers (new Data (false, "BeingWatched2"));

>

>

public class OnelWatcherTwoBeingWatched

{

public static vold main ( )

{

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

BelngWatchedl bWl= new BeingWatchedl ();

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

BeingWatched2 bW2= new BeingWatched2 ();

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

Watcher w= new Watcher();

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

bWl.addObserver (w);

bW2.addObserver (w);

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

bWl.go ( );

bW2.go ( );

>

/>*

Result:

BeingWatchedl true

BeingWatched2 false

*/

Возможно взаимное уведомление однотипных объектов, что показыва-

ет программа примера 8.4.1.4.

Пример 8.4.1.4. Два однотипных объекта уведомляют друг друга.

//////////

// Java

// Два объекта уведомляют друг друга