在事件处理程序之间共享数据?

时间:2009-08-07 23:40:42

标签: design-patterns

我处在一种情况,我想将一个对象发送给多个偶数处理程序,但是某些对象使用其他处理程序生成的数据。这听起来很不清楚 - 自己读它我不认为我会得到我所说的 - 所以我会举一个例子。

假设我有以下内容:

interface ChangeListener
{
   public add_change(Change)
   // ...
}

class ListenerA implements ChangeListener{...}
class ListenerB implements ChangeListener{...}

以及实际逻辑发生的地方:

List changes = ... // populated from somewhere else
List handlers = [new ListenerA(), new ListenerB()]

foreach(change in changes)
  foreach(handler in handlers)
    handler.add_change(change)

我的问题是ListenerA将要做的部分是为更改创建一个URL,我希望ListenerB能够访问该URL(因此它可以使用它)。作为一个具体示例,ListenerA可以使用博客API在更改上创建帖子,然后ListenerB可以发送包含该URL的电子邮件。

一个选项是让ListenerA使用新创建的URL向Change对象添加属性,但我不确定是否喜欢使用该对象。另一种方法是简单地按顺序调用它们并传入一个值(而不是循环遍历它们),但是我试图在这部分(发出更改)和尝试的听众之间保持清晰的关注点分离。并弄清楚如何处理它们 - 以便将来添加一个ListenerC所需要的只是在handlers列表中添加一个对象。

关于最佳方法的任何想法?

2 个答案:

答案 0 :(得分:1)

听起来你想要的是Listener B正在监听Listener A而不是同时监听同一个对象。基本上它会是一个链条。对象更改并告诉它的侦听器(侦听器A)。监听器A改变并告诉它的听众(听众B)。

由于B依赖于A,而B应该正在侦听。

答案 1 :(得分:0)

您可以尝试的解决方案之一是可以触发第一个事件并为其提供拒绝值。之后,您只能监听一次,然后将实际数据拒绝传递给后续作业。