观察者模式 -
假设:
现在,主管是否有责任向观察者发送仅有3个项目的更新?
OR
主题可以简单地告诉观察者有更新 - 从10中取出你想要的任何一个?
哪种方法正确?这有关系吗?
答案 0 :(得分:1)
主题是保留对该主题感兴趣的观察员列表,并通过调用其更新方法通知这些观察者。 观察者不保留其感兴趣的主题列表。
基于此,当主题被更新时,主体将调用更新(..)方法或类似其列表中的观察者。 subject可以 封装对象中的更改作为方法的参数,或传递此主题的this对象(观察者通过调用subject的方法本身获取感兴趣的数据)
答案 1 :(得分:0)
我宁愿选择有关不同事件的特定通知。通常用推模型。像Hey, I just earned some money. Here is actual amount I have earned
一样。而不是Hey, something happened to me.
。后者将所有逻辑移动到客户端(观察者)。客户端应验证已更改的内容,如果您有多个客户端,则此验证逻辑将重复。实际上,如果你没有其他观察者,你就不需要这种模式:)
此外,特定通知仅允许订阅客户感兴趣的事件。因此,当其他事情发生时(即主题观看电影时),观察者不会受到打扰。
答案 2 :(得分:0)
现在,主管是否有责任向观察者发送仅有3个项目的更新?
OR
主题可以简单地告诉观察者有更新 - 从10中取出你想要的任何内容?
哪种方法正确?这有关系吗?
这里没有绝对的正确答案。
这些是实施选择,实际上在Design Patterns中的观察者实施部分中提到:
_6。避免观察者特定的更新协议:推拉模型。观察者模式的实现通常使主体广播关于变化的附加信息。主题将此信息作为参数传递给Update。信息量可能差异很大。
在一个极端,我们称之为推模型,主体向观察者发送有关变化的详细信息,无论他们是否愿意。另一个极端是拉模型;除了最小的通知之外,主体只发送任何信息,观察者此后会明确要求提供详细信息。
拉模型强调主体对其观察者的无知,而推模型假设主体知道观察者的需要。推送模型可能会使观察者的可重用性降低,因为Subject类对Observer类进行了假设,这些假设可能并非总是如此。另一方面,拉模型可能效率低下,因为观察者类必须在没有主题帮助的情况下确定改变了什么。
_7。明确指定感兴趣的修改。您可以通过扩展主题的注册界面来提高更新效率,以便仅针对感兴趣的特定事件注册观察者。当发生此类事件时,主体仅通知那些已注册对该事件感兴趣的观察者。支持它的一种方法是使用Subject对象的方面概念。为了记录对特定事件的兴趣,观察者使用
附加到他们的主题void Subject :: Attach(Observer *,Aspect& interest);
其中interest指定感兴趣的事件。在通知时,主题将更改的方面作为更新操作的参数提供给其观察者。例如:
void Observer :: Update(Subject *,Aspect& interest);
如果在您的情况下使用推模型更有意义,那么主题对观察者的需求有更多的了解,并使用方面模型,以便观察者可以注册对主题的特定部分的兴趣数据,去吧!
我通常更喜欢使用拉模型并接受观察者对主题的一些详细了解(它更容易实现),但是你提出的建议在你的情况下可能很好。