Java 该代码是否滥用了观察者模式?
如果观察对象在以下一个或多个变量(动物)分配给新动物时通知其观察者,这是否是对观察者模式的不当使用,因为观察者将在只有一个子集发生变化时设置所有四个动物?如果是这样的话,如何解决这个问题?此外,如何构建一个接口,以指定观察者将设置这些特定的动物,而被观察者将在这些动物发生变化时通知观察者?提前谢谢。Java 该代码是否滥用了观察者模式?,java,design-patterns,observer-pattern,Java,Design Patterns,Observer Pattern,如果观察对象在以下一个或多个变量(动物)分配给新动物时通知其观察者,这是否是对观察者模式的不当使用,因为观察者将在只有一个子集发生变化时设置所有四个动物?如果是这样的话,如何解决这个问题?此外,如何构建一个接口,以指定观察者将设置这些特定的动物,而被观察者将在这些动物发生变化时通知观察者?提前谢谢。 public class ObserverClass implements Observer { public void update(Observable o, Object o1) {
public class ObserverClass implements Observer {
public void update(Observable o, Object o1) {
setHippo(o.getHippo());
setBassetHound(o.getBassetHound);
setOstrich(o.getOstrich());
setAntelope((o.getAntelope());
}
}
公共类Observer类实现了Observer{
公共无效更新(可观测o,对象o1){
setHippo(o.getHippo());
setBassetHound(o.getBassetHound);
刚毛鸵鸟(o.getOstrich());
刚毛羚羊((o.getAntelope());
}
}
- 仅更新子集
大多数情况下,这不是问题,很少有指令只刷新值。
但是,如果要更新子集,则应使用update
的第二个参数,并将其设置为一个判别式,以指示要更新的内容。为此,可以使用一组已更改的对象类型
- 观察特定动物
通常,如果(!should_observe(x))返回,您只需通过开始观察者的代码;
其中should_observe
说明是否将观察对象
另一种方法是创建一个可观察的对象,即oberver。
一个简单的例子更容易理解:
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
public类OvervableAnimal扩展了可观察的实现观察器{
私家动物;
//省略构造函数
公共同步的无效更新(可观察的o,对象arg){
如果(!动物存在(arg))
return;//不是正确的动物
setChanged();
观察者(arg);
}
}
observer类obs;
ObserverAnimal obsHippo=新的ObserverAnimal(Hippo.class);
obs.addObserver(obsHippo);
//如果您希望在河马发生变化时收到通知,请使用obsHippo
有时完全重新实现observer模式更容易:它给了您更多的控制,您的observable可能是一个接口,因此您不需要子类型。您可以使用notifyObservers(Object)
发送有关状态已更改的信息(将作为update()的第二个参数传入)
方法)。如何对更改进行编码取决于您。显然,您可以发送一份已更改动物的列表,但您必须执行一些丑陋的if块,以将动物放入正确的设置器。是否在只有一个子集更改时设置所有动物,真的是一个问题吗?这是我想知道的。这不是性能损失,我不确定是否是坏的设计?是什么让你认为这是需要“固定”的东西?在不久前的一个梦中,云朵散开,一束光照在我身上。当我凝视天空时,詹姆斯·戈斯林穿着一件饰有华丽珠宝的长袍走了下来。当时,他莫名其妙地向我乞求,“不必要地更新观察者变量是对四人帮的蔑视。”