你应该多么精细地制作你的Observables / Listenables?

时间:2009-09-11 08:10:20

标签: design-patterns oop listener observer-pattern

你有一个面向拉的Observable / Listenable,它会在某些状态发生变化时通知观察者/听众。

该州包含多个数据块,而您的一些观察员/听众并不关心整个州。

您是否通常更愿意通知所有观察员/听众,并允许他们在没有任何关心的情况下忽略通知?

或者你通常更喜欢每个“数据块”的单独Observable,这样你的观察者/听众只能得到他们需要回复的通知吗?

是否取决于具体情况?

您对Observables / Listenables的粒度有什么一般的想法吗?

4 个答案:

答案 0 :(得分:2)

您需要将维护成本与交付成本进行折衷。如果你有细粒度的事件定义,每个观察者只能获得他所需要的东西,所以你不需要为不感兴趣的观察者支付交付费用 - 但这样可以节省成本,因为每种新的块都需要添加到系统在某种程度上。

在交付成本相对较高的消息/子消息系统中(消息流经网络),人们通常需要特别注意主题定义。精心设计的主题层次结构通常很有用。所以我们得到像

这样的模式
  sport
       football
              england 
                    premier
                    champioship
              scotland
                    spl
              france
                    ...
       cricket
              australia
                    ...
              india
              sri lanka

因此允许各种级别的订阅。您可以订阅所有运动或(如某些人可能)直接

    sport/football/england/championship/watford

答案 1 :(得分:1)

作为一般的经验法则,专门的界面比伤害更有益,所以我肯定会实现更多而不是更少。

这显然确实会引起这种情况。如果有必要,只能以这种方式专注,并且从你的情况来看似乎是这样,否则就像告知谷物制造商小麦需要收获一样。它根本不适用。

答案 2 :(得分:0)

如果我必须这样做,我可能会创建一个Observable类,它将为每种块提供一个事件,并为任何一个块提供一个全局事件。有点像中途。

答案 3 :(得分:0)

这不仅仅是维护。 Observables和Observers之间的接口越具体,它们就会越耦合。

“四人帮”这本书有一个部分针对这个问题,他们建议反对推模型和拉模型。拉模型可能效率低,推模型可能无法重复使用。

所以,这在很大程度上取决于具体情况。我倾向于略高于拉模型。