2011-08-23 47 views
3

我从混合模式中获得的一个建议是为叶节点提供处理不合适的子管理操作的默认操作(即,在AddChild上抛出异常,返回儿童的空枚举等)。这是合成模式的有效解释吗?

我对经典模式的理解是有一个带有Leaf子类和Composite子类的抽象类,但是如果您在父类中提供了默认操作,那么它是否不会有效地避免需要Leaf?

有没有人这样做?

干杯,
Berryl

enter image description here

回答

2

这是可能的,我们正在谈论不同的事情。我假设该图案http://en.wikipedia.org/wiki/Composite_pattern

如描述的复合模式,你就不会暴露不适用于叶节点的业务,如AddChild(你的例子),因为Component接口(使用从名字维基百科文章)旨在仅公开可在叶或节点上执行的常见操作。所以不需要默认值。

在维基百科文章的Composite类中有add(),但是这是将组合添加到“视图”,而不是添加到任何特定的数据结构。换句话说,您可能通过复合接口访问数据树的某些部分,但接口上的add()方法正在添加或从该集合中删除项目,而不是从树本身。

+0

nah,它的模式相同,但维基百科文章是指我从GoF作为[变化](http://en.wikipedia.org/wiki/Composite_pattern#Variation)获知它的方式,这意味着它有点过时太!。我忘记了维基百科有时是多么有用。 – Berryl

+0

只是为了澄清,AddChild在哪里一直是一个争论的话题。如果你把它作为接口的一部分,那么组合的客户端不需要关心他们实际上是在处理一个Leaf还是一个Composite,GoF首选这个原因(你也不需要将组件转换为在AddChild上复合)。价格是你有一种方法对于这个类是不自然的,这就是为什么作者或者wikiopedia文章更愿意只在组合中拥有所有子管理操作的原因。 – Berryl

+0

我在*这个*特殊情况下做了什么决定,我确实只是有一个单一的树结构而没有对Leaf节点或Composite模式的强制需求,并且把GeographicBoundaryComposite折叠到GeographicBoundary中。干杯 – Berryl