2012-07-27 93 views
3

拥有类Container,ItemProperty,只要项目中的某个属性发生变化,就应该通知容器。通知另一班级的变化

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

我想到了2个选项尚未:

  1. Observer模式。
  2. 代理对象。

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

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

回答

3

在这种简单的情况下,我没有看到使用Observer的原因。由于一个Item只能在一个容器中,在一次我只是去给Item引用或指针,以它被放置在容器中。

Item的一些Property改变它能够通知它通过的Container该指针

Observer模式在您需要通知许多对象时很有用。

编辑

使用界面,非常简洁的设计也可能会损害您尽一切简单的事情。我觉得从zen of Python报价解释好我的意思:

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

所以,你应该在具有纯度和实用性的平衡

+1

我用这种方法看到的问题是“Item”变得依赖于“Container”,而“Container”依赖于“Item”。这对C++来说不是问题,但是它表明了一个设计缺陷。一般来说,我倾向于保持孤立。 – stschindler 2012-07-27 15:34:49

+2

@Tank:如果需要,可以通过一些'ContainterInterface'和'ItemInterface'或类似的东西进行通信。它与Observer模式的接口没有区别。但尽量不要使简单的事情复杂化) – Andrew 2012-07-27 15:37:42

+0

这是阅读_Clean Code_等书籍的结果。 ;)当''Item''依赖于''Container''时,我马上意识到,在单元测试中,老实说,在那里处理“Container”会感到很奇怪。界面想法对我来说听起来很不错,因为它消除了依赖关系。 – stschindler 2012-07-27 15:43:21

2

您应该使用最容易的理解和维护,并要求至少格局专门组件的发明。在我工作的环境中(objective-C),观察者模式就像它得到的那样简单。当您的通知请求更改时,它还具有灵活性。

Andrew的答案更简单 - 对象之间的直接通信不需要代理的发明或通知处理的开销。但它具有较低的灵活性,如果您将来需要它。

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

+0

“太重”意味着你实际描述的:观察者模式的开销。对于内部发生的事情(即用户永远不会订阅对象)。我能想到的最简单的解决方案是代理,但这非常烦人,因为它重复了代码。 – stschindler 2012-07-27 15:37:29

0

正如前面已经提到的,观察者在这里是相当多的矫枉过正,但是这个解决方案非常简单。你只需要“冒泡”事件。

  • 当一个属性被改变时,它通知它的父项。
  • 当一个项目被改变时(一个属性改变的副作用或者对该项目更重要的东西),它通知它的容器/父项)。
  • 当通知容器时,就完成了。如果容器可以嵌套,那么我猜它可以在必要时将事件引发到它的父容器。
+1

与Andrew的建议相似的问题:它会向上添加分层依赖关系。这就像一个车轮必须知道这辆车。 ;) – stschindler 2012-07-27 15:35:58

+0

@坦克,但在*感*车轮不需要知道汽车。它只是转向。这本身就是一个事件。汽车是否倾听车轮转向是无关紧要的。我们只是提供信息传播的机制。 :) – 2012-07-27 15:54:04

+0

这是真的,但是车轮也可以没有汽车,“Item”不能没有“Container”,除非你允许没有父母,但通常情况并非如此。好吧,足够的汽车愚蠢。 ;) – stschindler 2012-07-27 16:30:46

相关问题