我刚刚开始使用Observable
,Observer
和update()
方法,当不同的动作调用notifyObservers()
时,我无法理解应该怎么做。
我的意思是,我的Observable
课程有几种不同的方法可以最终调用setChanged()
和notifyObservers()
。根据被调用的方法,需要更新UI(Swing)的某些部分。但是,update()
类中只实现了一个Observer
方法。
我虽然将某些内容传递给notifyObservers()
方法然后我可以检查update()
上的参数,但它不是一种好方法。即使它确实如此,我应该通过什么?一个字符串,其中包含对action /方法的简短描述?一个int,就像一个动作/方法代码?还有别的吗?
处理这种情况的最佳方法是什么?
答案 0 :(得分:8)
一般来说,当你接到对update()的调用时,你应该从observable更新所有东西。如果这不可行,您可以将提示传递给notifyObservers()。
该团伙说,观察者模式的后果之一是:“意外更新。由于观察者不了解彼此的存在,他们可能对改变主题的最终成本视而不见。对该主题的看似无害的操作可能会导致观察者及其依赖对象的级联更新。此外,没有明确定义或维护的依赖性标准通常会导致虚假更新,这很难追查。
简单的更新协议没有提供有关主题变化的详细信息,这一问题更加严重。如果没有额外的协议来帮助观察者发现变化,他们可能会被迫努力推断变化。 “ 他们也在执行中说:
“避免观察者特定的更新协议:推送和拉取模型。观察者模式的实现通常让主题广播有关更改的附加信息。主题将此信息作为参数传递给更新。信息量可能会有所不同广泛。
在一个极端,我们称之为推模型,主体向观察者发送有关变化的详细信息,无论他们是否愿意。另一个极端是拉模型;除了最小的通知之外,主体只发送任何信息,观察者此后会明确要求提供详细信息。
拉模型强调主体对其观察者的无知,而推模型假设主体知道观察者的需要。推送模型可能会使观察者的可重用性降低,因为Subject类对Observer类进行了假设,这些假设可能并非总是如此。另一方面,拉模型可能效率低下,因为观察者类必须在没有主题帮助的情况下确定改变了什么。 “
答案 1 :(得分:3)
update()
的第二个参数是Object
类型,因此您可以传递任何适当的内容。如你所知,这种方法相当普遍。相反,维护EventListenerList
的类在按指定使用时可以获得一定程度的运行时类型安全性。