【问题标题】:Observer Pattern : How to differentiate Observables观察者模式:如何区分 Observables
【发布时间】:2012-05-26 23:12:54
【问题描述】:

在 Swing 应用程序中,文本框 1 取决于组合框 1 的选定项。它还依赖于文本框 2 的文本。像这样,文本框 1 可能依赖于各种组件。对于所有这些更改,将调用文本框 1 的 update() 方法(遵循可观察模式规则)。如何区分哪个组件发生了变化?

【问题讨论】:

  • 我不确定你在这里描述的是什么。您是否将应用程序域数据保存在 UI 层或其他地方?
  • 没有。不。我正在关注MVC。但我只是简短地解释了它。基本上,我订阅了 10 个新闻频道/订阅源。每当这些提要中有新的新闻项目时,我都希望收到通知。那是观察者模式吧?但现在我希望能够确定哪些新闻提要实际发生了变化。因为如果它来自新闻频道 1,我可能想用黑色显示,如果它来自新闻频道 2,我想用蓝色显示......我希望我能说清楚。
  • 我认为重新编写您的问题以使其更准确地反映您正在尝试做的事情是个好主意。

标签: java observer-pattern


【解决方案1】:

我不确定我是否理解你。但我认为观察者模式是错误的选择,观察者模式解决了忙等待问题,并通知许多对象主体(可观察者)发生了变化,反之亦然。你可以改变模式规则,让观察者向主题发送他们已经改变的消息,但这不再是观察者模式了。

注意:在处理设计模式时,一定要看看它们解决了什么问题,因为在很多情况下实现方式非常接近,以至于无法将它们与代码区分开来。

【讨论】:

  • 我会解释的。我订阅了 10 个新闻频道/订阅源。每当这些提要中有新的新闻项目时,我都希望收到通知。那是观察者模式吧?但现在我希望能够确定哪些新闻提要实际发生了变化。因为如果它来自新闻频道 1,我可能想用黑色显示,如果它来自新闻频道 2,我想用蓝色显示......我希望我能说清楚。
  • 很清楚,而不是观察者模式。观察者模式则相反,当一个特殊对象发生变化时,许多人会收到通知。你刚才描述的正好相反。因此,只需创建一个“管理器”函数,它会获取一个 integer\Enum 标识谁已更改,并调用相应的函数。可能有一个设计模式 - 但我不知道。
  • 仅供参考:根据你的标题,你的名字是错误的。是这样的: 主题 - 每个人都在听的那个;观察者 - 正在倾听主题的人。
【解决方案2】:

根据您实现观察者的方式,通常您会提供“发送者”或触发事件的组件。

这样做..虽然您的 Textbox1 订阅了 3 个事件..它可以检查谁是发件人/组件 是。

【讨论】:

  • 我不是在找那个。这样,如果有可能有 10 个发件人,我将不得不使用 10 个 instanceof 或 10 个 if 块来检查发件人
  • 或switch语句。我想知道你是否真的需要知道发件人。比如说 textbox1 的值取决于 10 个其他元素。你可以创建一个 updateTextBox() 来调查 10 个元素/计算值吗? Textbox1 只会关注更新/更改事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多