java - 这段代码是否滥用了观察者模式?

标签 java design-patterns observer-pattern

如果一个 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/

相关文章:

java - mongo 中的国家和城市关系

java - 如何在 Hibernate SessionFactory 创建新连接后立即运行 SQL 查询?

java - 如何从json中获取列表列表?

java - 使用哪种设计模式

design-patterns - Smalltalk中的代理模式实现

Java/Mysql 如何将整个 SQL 文件注入(inject) mysql 服务器?

c# - 使用 C# 撤消绑定(bind)对象中的更改

C++11 观察者模式(信号、槽、事件、改变广播器/监听器,或任何你想调用它的东西)

oop - 如何为观察者系统创建这种接口(interface)?

c# - 使用事件数组的委托(delegate)和事件的观察者模式