Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 该代码是否滥用了观察者模式?_Java_Design Patterns_Observer Pattern - Fatal编程技术网

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块,以将动物放入正确的设置器。

是否在只有一个子集更改时设置所有动物,真的是一个问题吗?这是我想知道的。这不是性能损失,我不确定是否是坏的设计?是什么让你认为这是需要“固定”的东西?在不久前的一个梦中,云朵散开,一束光照在我身上。当我凝视天空时,詹姆斯·戈斯林穿着一件饰有华丽珠宝的长袍走了下来。当时,他莫名其妙地向我乞求,“不必要地更新观察者变量是对四人帮的蔑视。”