【问题标题】:What's the significance of the second arguement in update() in Observer interface methodObserver接口方法中update()的第二个参数有什么意义
【发布时间】:2015-09-12 06:32:05
【问题描述】:

在研究观察者模式时 Observer 接口有更新方法:

public void update(Observable obs, Object obj)

第一个参数是发出update()方法的观察者,但是我看不懂第二个参数Object obj。 Oracle 文档将其声明为:

arg - 传递给 notifyObservers 方法的参数。

如果我尝试打印它,java会抛出NPE,如果它为null有什么用?

【问题讨论】:

  • 通过传递给docs.oracle.com/javase/7/docs/api/java/util/… 的内容调用它。但实际上,这些 Observable/Observer 类是 Java 早期设计糟糕的遗物,没有人使用。你最好忘记他们的存在。
  • 哦,如果它们已被弃用且过时,您能建议我使用更新更好的方法来完成相同的任务吗?
  • 定义一个接口(如 FooBarListener),当您的 FooBar 想要通知更改时调用回调方法。将方法 addFooBarListener() 和 removeFooBarListener() 添加到您的 FooBar 类。将侦听器存储在列表中。列表上的迭代器,并在需要时调用回调方法。或者,如果它们适合,则使用现有的 JavaBean 机制之一,例如 PropertyChangeListener/PropertyChangeSupport。在不了解用例的情况下很难给出最佳答案。

标签: java design-patterns


【解决方案1】:

我将首先回答您的查询 - update 调用中的 Object 参数是您传递给 notifyObservers() 方法的对象。注意notifyObservers() 也有一个重载notifyObservers(Object arg) 这个arg 是作为第二个参数传递给update 方法的。

有关示例,请参阅this 链接。

在您的情况下,您必须调用 notifyObservers() 重载 - 这可能默认为传递给 update 方法的空对象。

也就是说,Java 中的 Observable 模式是一个古老而脆弱的概念,正如 JB Nizet 所评论的那样。就替代方案而言,有一个 article 将使用 Spring Events 来实现观察者模式。

实现自己的也不是太难。看看这个example

【讨论】:

    【解决方案2】:

    每个注册的侦听器都会收到通知并接收该对象。这就像 javascript onClick 回调中的一个事件。如果您想通过 update() 向侦听器提供一些信息,该对象为您提供了方法。

    【讨论】:

      【解决方案3】:

      需要注意的重要一点是,两个参数方法实际上代表了两种传递给观察者的信息。 Observable 有两种通知方法 - notifyObservers()notifyObservers(Object args) - 在后一种方法中,参数是 任意数据对象传递。因此,如果应用程序想要支持推送数据,那么它将调用带有参数的方法并传递数据。然而,如果这 传递的对象为 null 则意味着 Observer 必须从 Observable 对象本身有趣的数据(其更改引起通知)。

      这个设计背后的整个想法是 Observable(主体)具有观察者感兴趣的状态。除了状态之外,它还有添加/删除/通知的方法。因此,应用程序(外部客户端)将拥有一个 Observable 引用,使用该引用它将调用适当的方法来添加/删除该特定 Observable 的 Observer 对象。使用这种设计,每个 Observable 都可以有一个单独的观察者列表。 Observable 对观察者的唯一了解是它有一个感兴趣的观察者列表。可以随时添加新的 Observer,也不需要修改 Observable 来添加新类型的 Observer 对象,只需要类实现 Observer 即可。

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        相关资源
        最近更新 更多