【问题标题】:What is the opposite of the observer pattern?观察者模式的反面是什么?
【发布时间】:2011-06-24 14:06:06
【问题描述】:

据我了解,观察者模式允许多个观察者监控一个主题。是否有相反情况的模式?是否有一个观察者模式可以监控多个主题并在其中任何一个引发(例如,通知事件)时做出响应?

【问题讨论】:

  • 这就像只有一个观察者和多个观察者。所以所有的 Observable 都会在其状态发生变化时更新单个 Observer,而 Observer 仍然可以在调用其 update(Observable o, Object arg) 时区分不同的 Observable。
  • 我觉得这里唯一的变化是Observer应该在运行时动态注册到新的Observable。意思是当新的Observable启动时;然后必须将其传达给 Observer 以进行注册。另一种方式是当新的观察者出现时;这个 Observer 对象总是在其构造函数中使用 Observable 构建的。所以像 Observable 构造函数之类的东西应该在它被启动时接受单个 Observer。

标签: oop design-patterns observer-pattern


【解决方案1】:

观察者模式仍然可以使用:只需将同一个对象注册为多个被监控对象的观察者。您可能希望“通知”事件接收某种观察对象标识符(“this”指针、唯一 ID 号等),以便观察对象可以选择适合报告事件的对象的操作。

【讨论】:

  • 我的想法完全正确。对我来说,这听起来仍然像是一种观察者模式。
  • 除非他只希望事件处理程序运行一次,无论有多少发布者触发该事件。
  • 补充:sourcemaking.com/design_patterns/observer(使用单个观察者“由设计者自行决定”)和eecho.info/Echo/design-pattern/observer-java-pattern(变体是“单个观察者与多个观察者”)跨度>
  • @Charles:这有点含糊(也许是做作的),但尽我所能:如何将“事件”与下一个事件区分开来?只有当发布者自己被赋予一些标记“这是由底层事件 123 触发”时才有可能,然后他们可以将其传递给顶级观察者,该观察者可以将 123 放入一组已处理的事件中,而忽略进一步的报告....
  • 感谢大家澄清这一点。 @anon:感谢您的链接。
【解决方案2】:

是的。这只是观察者模式的另一种应用。

观察者将自己添加到许多主题中。 如果您希望无论您正在观察哪个主题都执行相同的操作,那么这与您使用的观察者模式完全相同。

如果您想要根据哪个主题触发事件来单独操作,那么您可以使用传递给观察者的 ActionPerformed 方法的 Action 参数来帮助确定哪个主题触发了事件。 (这些名称可能会根据您选择的语言或库而改变)

【讨论】:

  • 感谢 WuHo 花时间回答我的问题。
【解决方案3】:

如果您只希望观察者反应一次,无论有多少被监控对象引发事件,那么一旦第一个源触发事件,您将必须让部分事件处理程序从所有其他源“取消注册”观察者,否则您将不得不决定应该使用什么频率或时间标准来决定何时来自另一个(或在某个定义的时间间隔后再次来自同一来源)的事件应该导致观察者再次做出反应......

【讨论】:

  • 我可能想在这里使用您的建议,因为我希望主题在引发其通知事件后被禁用。
【解决方案4】:

如果观察者监控的主题相似,那么你可以让观察者监控它们,如果不是,我认为你最好分开监控,然后你将遵循单一责任规则。

【讨论】:

    【解决方案5】:

    还要考虑相关的中介者模式。

    中介者模式定义了一个对象,该对象封装了一组对象如何交互 (Wikipedia)

    更多信息在这里:http://sourcemaking.com/design_patterns/mediator

    我也很喜欢@CDC 在Mediator Vs Observer Object-Oriented Design Patterns 上的回答:

    观察者模式:定义对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖关系都会得到通知并自动更新。

    中介者模式:定义一个对象来封装一组对象如何交互。 Mediator 通过阻止对象显式地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多