Подтвердить что ты не робот

Наблюдается на Java

Я пытаюсь понять Наблюдателя и Наблюдаемого.

Вот пример, который я пытаюсь выяснить:

public class IntegerDataBag extends Observable implements Iterable<Integer> {

    private ArrayList<Integer> list= new ArrayList<Integer>();

    public void add(Integer i){
        list.add(i);
        setChanged();
        notifyObservers();
    }

    public Iterator<Integer> iterator(){
        return list.iterator();
    }

    public Integer remove (int index){
        if (index< list.size()){
            Integer i = list.remove(index);
            setChanged();
            notifyObservers();
            return i;
        }
        return null;
    }

}

public class IntegerAdder implements Observer {

    private IntegerDataBag bag;

    public IntegerAdder(IntegerDataBag bag) {
        this.bag = bag;
        bag.addObserver(this);
    }

    public void update(Observable o, Object arg) {
        if (o == bag) {
            System.out.println("The contents of the IntegerDataBag have changed");
        }
    }

}
  • bag.addObserver() можно сделать только потому, что IntegerDataBag extends Observable?

  • Где этот наблюдатель добавляется? Что создается и где?

  • В чем разница между setChanged() и notifyObservers()?

  • Я не понимаю метод update; что означает arg? Почему мне нужно проверить, что o==bag? Почему я должен обновить еще один наблюдаемый?

  • Зачем мне нужен этот наблюдатель?

4b9b3361

Ответ 1

  • Да. addObserver - метод в абстрактном классе Observable. См. Observable в документации по Java.
  • Он добавлен в список в Observable.
  • Вызов notifyObservers ничего не сделает, пока не будет установлен setChanged.
  • У вас может быть несколько Observables в одном приложении.
  • Observer - общий шаблон проектирования. Обычный пример - когда у вас есть модель и несколько видов. Каждый вид является наблюдателем на модели; если модель изменяется, представления обновляются.

Ответ 2

Возьмем практический пример для шаблона Observer: Twitter. С Twitter мы можем следить за некоторыми другими людьми и читать все, что они публикуют, в режиме реального времени.

Каждый пользователь Twitter может наблюдаться. Вы можете добавить себя в качестве слушателя ( "Последователь" ) и прочитать его/ее сообщения. Каждый пользователь щебетает "уведомлять последователей" (notifyObservers).

Здесь мы делаем то же самое. Класс IntegerDataBag имеет возможность уведомлять другие классы всякий раз, когда значение добавляется или удаляется из внутреннего пакета. Любой экземпляр (который реализует Observer) может зарегистрировать себя в IntegerDataBag и будет получать сообщения через метод обратного вызова (update).

Короче говоря, мы делаем следующее:

  • Наблюдатель (слушатель, IntegerAdder) добавляет себя к наблюдаемому (IntegerDataBag)
  • Что-то происходит на наблюдаемом и наблюдаемом уведомляет своих наблюдателей.
  • Наблюдаемый вызовет методы обратного вызова всех фактических наблюдателей.
  • Наблюдатель теперь получил уведомление об этом событии и может использовать его

Надеюсь, это краткое описание помогает понять этот шаблон.


публикация/подписка является аналогичным шаблоном: издатель похож на наблюдаемого, такого абонента, как наблюдатель. И еще один практический пример: можно подписаться на газету, и издатель отправит эту бумагу, пока вы не отмените подписку.

Ответ 3

Файл bag.addObserver() может быть выполнен только потому, что IntegerDataBag расширяется Наблюдаемое?

Правильно, Observable - это класс, который имеет метод addObserver().

Где этот наблюдатель добавляется? что создается и где?

Класс Observer содержит List или Vector (в источнике JDK) объектов Observable.

private Vector obs;

Что там хранится.

В чем разница между setChanged() и notifyObservers()?

Значок setChanged() просто отмечает, что Observable изменен. notifyObservers() просто вызывает всех наблюдателей, которые он имеет в списке, в update() (передача измененного объекта в Observer), только если для параметра setChanged установлено значение true.

Я не понимаю метод обновления - что означает args? а также почему мне нужно проверить, что o == bag, зачем мне обновлять другую наблюдаемыми?

Метод update() сообщает Observer, что он должен обновляться на основе измененного obj, который он получает. Это вызывается notifyObservers() из Observable.

Зачем мне нужен этот наблюдатель?

Чтобы создать сценарий Listener для событий, например, если вы хотите получать информацию об изменении ваших наблюдаемых объектов, необходим Observer.

Читайте: GoF - Шаблон наблюдателя.

Ответ 4

Bag.addObserver() может быть создан только потому, что IntegerDataBag расширяется Наблюдаемое?

Да.

2.Когда этот наблюдатель добавляется? что создается и где?

В соответствующий класс Observable, который распространяется на ваш класс.

4. Я не понимаю метод обновления - что означает args?

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

и почему мне нужно проверить, что o == bag, зачем мне обновлять другую наблюдаемый?

Вам ничего не нужно проверять.

5.Почему мне нужен этот наблюдатель в любом случае?

Это очень полезный шаблон дизайна. Посмотрите на wikipedia статья.

EDIT: Я пропустил пункт:

Чем отличаются функции setChanged() и notifyObservers()?

setChanged() отмечает объект, сигнализирующий о его изменении. notifyObservers несет ответственность за то, чтобы все наблюдатели прослушивали наблюдаемый объект.

Ответ 5

Bag.addObserver() может быть выполнен только потому, что IntegerDataBag расширяет Observable?

Да, метод addObserver реализован в Observable.

Где этот наблюдатель добавляется? что создается и где?

Наблюдатель добавляется в список наблюдателей, объявленный в Observable как закрытый, поэтому он не отображается в вашем подклассе.

Чем отличаются функции setChanged() и notifyObservers()?

Когда вы вызываете notifyObservers() без первого вызова setChanged(), никаких уведомлений не происходит.

Я не понимаю метод обновления - что означает args? и почему мне нужно проверить, что o == bag, зачем мне обновлять еще одно наблюдаемое?

Один Observer может смотреть несколько Observables. Изучив первый параметр метода update, вы можете выяснить, какой наблюдатель уведомляет вас о чем-то.

Зачем мне нужен этот наблюдатель?

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

Ответ 6

В ответ на ваши вопросы.

  • Да, вы правы.

  • Наблюдатель добавляется в список, поддерживаемый объектом Observable

  • Вам необходимо вызвать setChanged(), прежде чем вы будете уведомлять наблюдателей, иначе они не узнают, что объект изменился. Как только вы вызываете notifyObservers(), все обозреватели уведомляются об изменении. Если вы сначала не вызываете setChanged, ваши наблюдатели не будут уведомлены.

  • arg - это все, что вы хотели бы передать Наблюдателям при вызове notifyObservers (arg);

Ответ 7

Схема наблюдателя похожа на концепцию слушателей. Объект, который прослушивается, ведет запись всех слушателей. Например, класс контроля запасов может позволить объектам прослушивать определенное событие, например уровень запаса, который падает ниже уровня предупреждения.

С точки зрения наблюдателя:

Вызвать subscribe() или addEventListener() или тому подобное. Наблюдатель затем "уведомляется", когда событие на самом деле происходит, обычно посредством вызова функции в наблюдателе (функция обработчика события).

с наблюдаемой точки зрения:

Объекты, желающие наблюдать наблюдаемый объект, регистрируют их интерес, вызывая subscribe() или addEventListener(), как указано выше. Наблюдаемое добавляет этих наблюдателей к массиву, списку или некоторой другой структуре данных.

Как только событие на самом деле происходит, слушатели уведомляются, вызывая функцию обработчика событий в классе наблюдателей.

Ответ 8

Метод update() вызывается Observable. Этот метод вызывается вызовом notifyObservers(), который повторяет все наблюдатели и вызывает обновление на них. Это информирует Наблюдателя о том, что объект, который они наблюдают, был изменен и может быть выполнено определенное действие. Объект args - это то, что вы хотите, оно может быть нулевым, но оно может использоваться для информирования наблюдателей о том, какой тип обновления имел место.

Ответ 9

Bag.addObserver() может быть выполнен только потому, что IntegerDataBag расширяет Observable?

Да, это все.

Где этот наблюдатель добавляется? что создается и где?

Он добавляет IntegerAdder в список классов, которые наблюдают за IntegerDatabag для изменений. С этого момента, если произойдет изменение на IntegerDatabag, он уведомит IntegerAdder с помощью метода notifyObservers(), который вызовет его метод update().

В чем разница между setChanged() и notifyObservers()?

notifyObservers() вызывает метод update() каждого наблюдателя вашего наблюдаемого и используется для передачи информации этому методу. Что касается setChanged(), он помечает ваш объект как "измененный", так что метод hasChanged() теперь вернет true... Он использовался для мониторинга изменений в вашем наблюдаемом классе.

Я не понимаю метод обновления - что означает args?

Метод update() наследуется от реализации интерфейса наблюдателя - вы должны его реализовать. Object arg - необязательный аргумент, который вы можете передать методу через notifyObservers().

Почему мне нужно проверить, что o == bag, зачем мне обновлять другое наблюдаемое?

Поскольку наблюдатель может "наблюдать" более одного "наблюдаемого", вам нужно проверить, что это действительно IntegerDatabag, вызвавшее update(), следовательно o==bag.

Зачем мне нужен этот наблюдатель?

Вам необходимо, чтобы наблюдатель наблюдал за IntegerDatabag для изменений. В вашем случае вы печатаете сообщение в консоли при изменении IntegerDatabag. Цель модели Observer/Observable заключается в том, чтобы отслеживать изменения конкретных объектов, а затем обновлять программу на основе изменений.