【发布时间】:2013-03-17 03:11:44
【问题描述】:
Composite 是否有理由不具有 isLeaf() 方法?
(因为这种模式的重点是(如果我没记错的话)能够同时使用 Leaf 和 Composite 作为同一事物,而无需区分?)
或者,如果我仍然可以像使用它们一样使用它们,那绝对没问题,但是如果我愿意,也可以找出哪个是哪个?
【问题讨论】:
标签: design-patterns language-agnostic composite
Composite 是否有理由不具有 isLeaf() 方法?
(因为这种模式的重点是(如果我没记错的话)能够同时使用 Leaf 和 Composite 作为同一事物,而无需区分?)
或者,如果我仍然可以像使用它们一样使用它们,那绝对没问题,但是如果我愿意,也可以找出哪个是哪个?
【问题讨论】:
标签: design-patterns language-agnostic composite
关于 Composite 的一个有争议的问题是如何处理叶类中的 getChildren()。如果您正在使用接口,则可以将其放在共享接口中,然后在叶类中抛出 UnsupportedOperationException。
您还可以使用访问者对不同的节点类型进行不同的处理,因此以文件夹/文件组合为核心的经典文件系统,您可以使用访问者来轻松为不同的节点提供特殊操作类型(或仅处理特定类型)。
您有计划如何使用它吗?或许具体案例会是一种更好的方式来判断方法的价值。
【讨论】:
我的理解也是,这种模式的本质是在迭代项目时不需要知道引用的实际类型。但是,我使用了该模式并尝试将其转换为特定类型,这实际上与区分 isLeaf 相同。这显然贬低了多态性并违反了 OCP,但它在这种情况下可以正常工作。
我将设计模式视为扶手,而不是手铐。
【讨论】: