观察者模式
- 假设:
- 在 10 个项目中,观察者只想订阅 3 个。
- 对象调用观察者的函数让他知道有一些更新。
现在,主体是否有责任将仅与 3 个项目有关的更新发送给观察者?
或者
主题可以简单地告诉观察者有更新 - 去获取你想要的 10 个?
哪个是正确的出路?有关系吗?
观察者模式
- 假设:
现在,主体是否有责任将仅与 3 个项目有关的更新发送给观察者?
或者
主题可以简单地告诉观察者有更新 - 去获取你想要的 10 个?
哪个是正确的出路?有关系吗?
Subject 保存了一个对该主题感兴趣的 Observer 列表,并通过调用其 update 方法通知这些 Observer。观察者不保留它感兴趣的主题列表。
Based on this, when a subject is updated, the subject will call the update(..) method or something similar of those Observers in its list. subject can either encapsulate the changes in an object as a parameter of the method, Or pass the this object of this subject (observers get the interested data by calling subject's methods themselves).
我宁愿使用有关不同事件的特定通知。通常采用推送模式。喜欢Hey, I just earned some money. Here is actual amount I have earned
。而不是Hey, something happened to me.
. 后者将所有逻辑移至客户端(观察者)。客户端应验证已更改的内容,如果您有多个客户端,则此验证逻辑将重复。实际上,如果您没有其他观察者,则不需要这种模式:)
此外,特定通知允许仅订阅客户感兴趣的事件。因此,当其他事情发生时(即当对象观看电影时),观察者不会受到打扰。
现在,主体是否有责任将仅与 3 个项目有关的更新发送给观察者?
或者
对象可以简单地告诉观察者有更新 - 从 10 个中获取任何你想要的?
哪个是正确的出路?有关系吗?
这里没有绝对正确的答案。
这些是实现选择,实际上在设计模式中观察者的实现部分中提到了:
_6。避免特定于观察者的更新协议:推拉模型。观察者模式的实现通常让主题广播有关更改的附加信息。主题将此信息作为参数传递给 Update。信息量可能有很大差异。
在一种极端情况下,我们称之为推送模型,主体向观察者发送有关更改的详细信息,无论他们是否想要。另一个极端是拉模型。主体只发送最少量的通知,然后观察者明确要求提供详细信息。
拉模型强调主体对其观察者的无知,而推模型则假设主体对他们的观察者的需求有所了解。推模型可能会降低观察者的可重用性,因为 Subject 类对 Observer 类做出的假设可能并不总是正确的。另一方面,拉模型可能效率低下,因为观察者类必须在没有主体帮助的情况下确定发生了什么变化。
_7。明确指定感兴趣的修改。您可以通过扩展主题的注册接口以允许仅针对感兴趣的特定事件注册观察者来提高更新效率。当这样的事件发生时,对象只通知那些对该事件感兴趣的观察者。支持这一点的一种方法是使用 Subject 对象的方面的概念。为了注册对特定事件的兴趣,观察者使用
void Subject::Attach(Observer*, Aspect&interest);
其中interest 指定了感兴趣的事件。在通知时,主体将更改的方面作为更新操作的参数提供给其观察者。例如:
void Observer::Update(Subject*, Aspect&interest);
如果在您的情况下使用推送模型更有意义,那么主题对观察者的需求有更多了解,并使用方面模型以便观察者可以注册对主题数据的特定部分的兴趣,去为了它!
我通常更喜欢使用拉模型并接受观察者对该主题有一些详细的了解(实现起来更简单),但是您提出的建议可能适合您的情况。