Этот код злоупотребляет шаблоном наблюдателя? - PullRequest
1 голос
/ 16 марта 2011

Если наблюдаемый объект уведомляет своих наблюдателей, когда одной или нескольким переменным (животным), указанным ниже, назначается новое животное, является ли это неправильным использованием шаблона наблюдателя, поскольку наблюдатель в конечном итоге установит всех четырех животных, когда подмножество их изменилось? Если так, как это можно исправить? Кроме того, как можно построить интерфейс, который бы указывал, что Наблюдатель должен установить этих конкретных животных и что Наблюдаемое должно уведомить Наблюдателей, если эти животные изменены? Заранее спасибо.

<code>
public class ObserverClass implements Observer {
    public void update(Observable o, Object o1) {
        setHippo(o.getHippo());
        setBassetHound(o.getBassetHound);
        setOstrich(o.getOstrich());
        setAntelope((o.getAntelope());
    }
}

Ответы [ 2 ]

1 голос
/ 16 марта 2011

вы можете использовать notifyObservers(Object) для отправки информации о том, какое состояние изменилось (которое будет передано в качестве второго аргумента методу update()). как вы кодируете изменения, зависит от вас. Очевидно, что вы могли бы отправить Список измененных животных, но вам пришлось бы сделать несколько уродливых блоков, чтобы получить животных в правильных сеттеров.

1 голос
/ 16 марта 2011
  • Обновление только подмножества

В большинстве случаев это не проблема, есть несколько инструкций, которые просто обновят значения. Однако, если вы хотите обновить подмножество, вы должны использовать второй аргумент update и установить для него дискриминант, который скажет, что обновлять. Для этого вы можете использовать набор типов объектов, которые изменились.

  • Наблюдение за конкретными животными

Часто вы просто начинаете код своего наблюдателя с if (!should_observe(x)) return;, где should_observe указывает, будет ли объект наблюдаться.

Другой способ сделать это - создать наблюдаемое, которое будет обервером. Быстрый пример легче понять:

public class OvervableAnimal extends Observable implement Observer {
  private Class<?> animal;
  // constructor omitted
  public synchronized void update(Observable o, Object arg) {
    if (!animal.isInstance(arg))
      return; // not the right animal
    setChanged();
    notifyObservers(arg);
  }
}
ObserverClass obs;
ObserverAnimal obsHippo = new ObservableAnimal(Hippo.class);
obs.addObserver(obsHippo);
// use obsHippo if you want to be notified when a hippo has changed

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

...