如果一个Observable对象在下面的一个或多个变量(动物)被分配给一只新动物时通知其观察者,这是观察者模式的不当使用,因为观察者最终只设置了所有四只动物他们的子集发生了变化?如果是这样,怎么能修复?另外,如何构建一个接口来指定观察者设置那些特定的动物,并且Observable是否通知观察者这些动物是否被改变了?提前致谢。
public class ObserverClass implements Observer {
public void update(Observable o, Object o1) {
setHippo(o.getHippo());
setBassetHound(o.getBassetHound);
setOstrich(o.getOstrich());
setAntelope((o.getAntelope());
}
}
答案 0 :(得分:1)
大多数情况下,这不是问题,只有很少的指令会刷新值。
但是,如果要更新子集,则应使用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
有时完全重新实现观察者模式更容易:它为您提供更多控制,而您的可观察可能是一个界面,因此您不需要子类型。
答案 1 :(得分:1)
您可以使用notifyObservers(Object)
发送有关状态已更改的信息(将作为update()
方法的第二个参数传入)。如何编码更改取决于您。显然,你可以发送一个已经改变的动物的清单,但你必须做一些丑陋的块,以便让动物进入正确的孵化器。