滥用观察者模式?

时间:2009-11-05 23:19:24

标签: c# .net design-patterns oop

我有一个Car对象,其中包含纬度字段和经度字段。我使用观察者模式,以便任何时候这些字段中的任何一个在我的应用程序中发生变化,我的汽车对象都会得到通知 我现在发现需要创建其他几个汽车对象,其默认值我希望与当前纬度和当前经度相同。我可以在Notifier对象中保持这种状态,当一个新的观察者(新车)注册听时我可以重新广播这些值,这样新的监听器就会是最新的。
这是对观察者模式的误用,即设计不好吗?

4 个答案:

答案 0 :(得分:1)

我认为这是一个很好地利用观察者模式的教科书例子。

当然,你可能有一些疑虑,你有疑虑。如果您解释了您的疑虑,可以更好地讨论这些问题。

答案 1 :(得分:1)

唯一让我觉得这种方法很危险的事情是,你可以很容易地对你的观察者进行编码,以便假设如果他们收到通知,就会发生一些变化。通过上面的设置,这已不再适用。因此,如果他们在收到通知时应该执行任何操作,您的观察员必须检查是否真的发生了变化。

可能是常识,但如果您要修改现有代码,也会轻松疏忽。

答案 2 :(得分:0)

如果您的主题(知道当前纬度和经度的对象)也公开了一个getter方法,那会更好。注册后,任何新的监听器(示例中的新车)都可能获得当前值(纬度/经度),然后通过广播通知任何更改。这样可以避免不必要地通知已经注册的听众。

考虑到在观察者模式的常见变体中,主体通知听众发生了变化,然后听众主动从主体中查询当前值(因此需要getter方法)。

答案 3 :(得分:0)

观察者模式用于一对多关系。当您想要通知多个对象时,当一个对象更改状态时。你的案子是多对一的。我认为它是滥用(我可能是错的)。明显的影响是代码的复杂性。但副作用可能是丧失灵活性。看看这样,有什么变化。如果您想添加更多Car,则无需更改通知接收器。接收器现在需要了解您的新车的实施情况。它所关心的只是国家。

现在,当您想要添加更多接收器时会发生什么,这将是最可能的情况(需求未经过考虑:))。在这种情况下,所有汽车对象都需要更改以引用新的接收器。