观察者模式 - 主体跟踪观察者要观察的项目

时间:2012-05-02 12:13:38

标签: oop design-patterns observer-pattern

观察者模式 -
假设:

  • 在10个项目中,观察者只想订阅3.
  • 主体召唤观察者的一个功能让他知道那里 是一些更新。

现在,主管是否有责任向观察者发送仅有3个项目的更新?
OR
主题可以简单地告诉观察者有更新 - 从10中取出你想要的任何一个?

哪种方法正确?这有关系吗?

3 个答案:

答案 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);

如果在您的情况下使用推模型更有意义,那么主题对观察者的需求有更多的了解,并使用方面模型,以便观察者可以注册对主题的特定部分的兴趣数据,去吧!

我通常更喜欢使用拉模型并接受观察者对主题的一些详细了解(它更容易实现),但是你提出的建议在你的情况下可能很好。