如果一个 Observable 对象在下面的一个或多个变量(动物)被分配给一个新动物时通知它的观察者,这是否是观察者模式的不当使用,因为当只有一个动物时,观察者最终将设置所有四个动物他们的子集发生了变化?如果是这样,如何解决这个问题?另外,如何构建一个接口(interface)来指定观察者设置那些特定的动物,并且可观察对象在这些动物发生变化时通知观察者?提前致谢。
public class ObserverClass implements Observer {
public void update(Observable o, Object o1) {
setHippo(o.getHippo());
setBassetHound(o.getBassetHound);
setOstrich(o.getOstrich());
setAntelope((o.getAntelope());
}
}
最佳答案
- 仅更新子集
大多数时候,这不是问题,很少有指令会刷新值。 但是,如果您想更新子集,则应使用 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
有时,完全重新实现观察者模式会更容易:它为您提供了更多控制权,并且您的可观察可能是一个接口(interface),因此您不需要子类型。
关于java - 这段代码是否滥用了观察者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5330350/