这段代码滥用观察者模式吗?

时间:2011-03-16 18:59:26

标签: java design-patterns observer-pattern

如果一个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());
    }
}

2 个答案:

答案 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()方法的第二个参数传入)。如何编码更改取决于您。显然,你可以发送一个已经改变的动物的清单,但你必须做一些丑陋的块,以便让动物进入正确的孵化器。