3

拥有类Container,ItemProperty,每当项目中的属性发生变化时,都会通知容器。

容器是项目的所有者,需要信息来根据它们的属性正确管理它们。

我已经想到了2个选项:

  1. 观察者模式。
  2. 代理对象。

在我看来,观察者模式似乎对这项任务来说太重了。代理对象可以很好地工作,但是在这种情况下,我会违反 DRY 原则,因为我必须将调用从代理转发到实际对象。

要求是对用户隐藏详细信息。要求不需要调用某些update_item()函数或类似的函数,即把通知容器的责任交给用户,这可能会导致使用问题。

4

3 回答 3

4

在这种简单的情况下,我看不到使用Observer. 由于 anItem一次只能在一个容器中,因此我只需提供Item指向它所在容器的引用或指针即可。

当某些更改时PropertyItem它能够Container通过该指针通知它

Observer如果您需要通知许多对象,模式很有用。

编辑

使用接口和极其简洁的设计来做每一件简单的事情也可能会伤害你。我认为这句话zen of Python很好地解释了我的意思:

Special cases aren't special enough to break the rules. //make Interfaces
Although practicality beats purity. //but not everywhere

所以你应该在纯度和实用性之间取得平衡

于 2012-07-27T15:06:05.237 回答
2

您应该使用最容易理解和维护的模式,并且需要最少的专门组件的发明。在我工作的环境(objective-C)中,观察者模式非常简单。当您的通知要求发生变化时,它还提供了灵活性。

Andrew 的回答是事件更简单——对象之间的直接通信不需要代理的发明或通知处理的开销。但是,如果您将来需要它,它的灵活性较小。

我不确定“太重”是什么意思。也许你可以解释一下。

于 2012-07-27T15:09:15.967 回答
0

正如之前提到的,观察者在这里非常过分,但解决方案非常简单。你只需要“冒泡”事件。

  • 当一个属性发生变化时,它会通知它的父项。
  • 当一个项目发生变化时(属性变化的副作用,或者对项目更不可或缺的东西),它会通知它的容器/父项)。
  • 当通知容器时,您就完成了。如果容器可以嵌套,那么我猜它可以在必要时向其父容器引发事件。
于 2012-07-27T15:11:31.450 回答