- Обновление только подмножества
В большинстве случаев это не проблема, есть несколько инструкций, которые просто обновят значения.
Однако, если вы хотите обновить подмножество, вы должны использовать второй аргумент 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
Иногда проще полностью переопределить шаблон наблюдателя: он дает вам больше контроля, и ваша наблюдаемая может быть интерфейсом, поэтому вам не нужно будет вводить подтипы.