【问题标题】:Observer pattern-The subject keeps track of the items to be observed by the observer观察者模式——主体跟踪观察者要观察的项目
【发布时间】:2012-05-02 12:13:37
【问题描述】:

观察者模式-
假设:

  • 在 10 个项目中,观察者只想订阅 3 个。
  • 对象调用观察者的函数让他知道那里 是一些更新。

现在,主体是否有责任将仅与 3 个项目相关的更新发送给观察者?
或者
主题可以简单地告诉观察者有更新 - 从 10 个中获取你想要的任何一个?

正确的出路是什么?有关系吗?

【问题讨论】:

  • 物品是什么意思?您的subject 有项目集合,并在这些项目发生变化时通知observers
  • @lazyberezovsky Items 表示观察者想要订阅的东西。

标签: oop design-patterns observer-pattern


【解决方案1】:

Subject 保留了对这个主题感兴趣的观察者列表,并通过调用其更新方法通知这些观察者。 观察者确实保留它感兴趣的主题列表。

基于此,当更新主题时,主题将调用 update(..) 方法或类似其列表中的那些观察者的东西。 subject 可以或者将对象的变化封装为方法的参数,或者传递这个subject的this对象(观察者通过自己调用subject的方法获取感兴趣的数据) .

【讨论】:

    【解决方案2】:

    我宁愿使用有关不同事件的特定通知。通常采用推送模型。喜欢Hey, I just earned some money. Here is actual amount I have earned。而不是Hey, something happened to me.。后者将所有逻辑移至客户端(观察者)。客户端应验证已更改的内容,如果您有多个客户端,则此验证逻辑将重复。实际上,如果您没有其他观察者,则不需要这种模式:)

    此外,特定通知允许仅订阅客户感兴趣的事件。因此,当其他事情发生时(即当对象观看电影时),观察者不会受到打扰。

    【讨论】:

      【解决方案3】:

      现在,主体是否有责任将仅与 3 个项目相关的更新发送给观察者?

      主题可以简单地告诉观察者有更新 - 从 10 个中获取任何你想要的?

      正确的出路是什么?有关系吗?

      这里没有绝对正确的答案。

      这些是实现选择,实际上在 Design Patterns 的 Observer 的实现部分中提到了:

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

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

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

      _7。明确指定感兴趣的修改。您可以通过扩展主题的注册接口以允许仅针对感兴趣的特定事件注册观察者来提高更新效率。当这样的事件发生时,对象只通知那些对该事件感兴趣的观察者。支持这一点的一种方法是使用 Subject 对象的方面的概念。为了记录对特定事件的兴趣,观察者使用

      附加到他们的主题

      void Subject::Attach(Observer*, Aspect&interest);

      其中兴趣指定感兴趣的事件。在通知时,主体将更改的方面作为更新操作的参数提供给其观察者。例如:

      void Observer::Update(Subject*, Aspect&interest);

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

      我通常更喜欢使用拉模型并接受观察者对该主题有一些详细的了解(实现起来更简单),但您提出的建议可能适合您的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 2023-04-10
        • 2011-09-25
        • 2012-05-11
        • 2019-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多