6

我刚开始玩ObservableObserver它的update()方法,我不明白当不同的动作调用时我应该怎么做notifyObservers()

我的意思是,我的Observable班级有几种不同的方法可以调用setChanged()notifyObservers()最终调用。根据调用的方法,UI 的某些部分(Swing)需要更新。但是,该类中只update()实现了一种方法。Observer

我想将一些东西传递给该notifyObservers()方法,然后我可以检查参数,update()但这感觉不是一个好方法。即使是这样,我应该通过什么?带有动作/方法的简短描述的字符串?一个int,比如一个动作/方法代码?还有什么?

处理这种情况的最佳方法是什么?

4

2 回答 2

8

一般来说,当你调用 update() 时,你应该更新 observable 中的所有内容。如果这不切实际,您可以将提示传递给 notifyObservers()。

书上说,观察者模式的后果之一是:

“意外更新。由于观察者不知道彼此的存在,他们可能对改变主体的最终成本视而不见。对主体的看似无害的操作可能会导致对观察者及其依赖对象的级联更新。此外,依赖没有明确定义或维护的标准通常会导致虚假更新,这很难追踪。

简单的更新协议没有提供有关主题更改的详细信息,这一事实加剧了这个问题。如果没有额外的协议来帮助观察者发现发生了什么变化,他们可能会被迫努力推断变化。“也在实施中,他们说:

“避免特定于观察者的更新协议:推拉模型。观察者模式的实现通常让主体广播有关更改的附加信息。主体将此信息作为参数传递给更新。信息量可能有很大差异。

在一种极端情况下,我们称之为推送模型,主体向观察者发送有关更改的详细信息,无论他们是否想要。另一个极端是拉模型。主体只发送最少量的通知,然后观察者明确要求提供详细信息。

拉模型强调主体对其观察者的无知,而推模型则假设主体对他们的观察者的需求有所了解。推送模型可能会降低观察者的可重用性,因为 Subject 类对 Observer 类做出的假设可能并不总是正确的。另一方面,拉模型可能效率低下,因为观察者类必须在没有主体帮助的情况下确定发生了什么变化。"

于 2010-06-01T02:39:46.887 回答
3

to 的第二个参数update()是 type Object,所以你可以传递任何合适的东西。正如您所注意到的,这种方法相当笼统。相反,维护 的类EventListenerList在按规定使用时可以获得一定程度的运行时类型安全性。

于 2010-06-01T02:19:12.060 回答