复合材料不应该有一个isLeaf()
方法是有原因的吗?
(因为这种模式的重点是(如果我没记错的话)能够同时使用Leaf和Composite作为同一个东西,而不区分?)
或者,如果我仍然可以像使用它们一样使用它们,是否完全可以,但如果我愿意,还可以找出哪个是哪个?
复合材料不应该有一个isLeaf()
方法是有原因的吗?
(因为这种模式的重点是(如果我没记错的话)能够同时使用Leaf和Composite作为同一个东西,而不区分?)
或者,如果我仍然可以像使用它们一样使用它们,是否完全可以,但如果我愿意,还可以找出哪个是哪个?
关于 Composite 争论的问题之一是如何处理叶类中的 getChildren()。如果您正在使用接口,则可以将其放在共享接口中,然后在叶类中抛出 UnsupportedOperationException。
您还可以使用访问者对不同的节点类型进行不同的处理,因此以文件夹/文件组合为核心的经典文件系统,您可以使用访问者来轻松为不同类型提供特殊操作(或只处理特定类型)。
你有如何使用它的计划吗?也许具体案例将是一种更好的方式来确定该方法的价值。
我的理解也是,这种模式的本质是在迭代项目时,您不需要知道您引用的实际类型。但是,我使用了该模式并尝试将其转换为特定类型,这实际上与区分 isLeaf 相同。这显然贬低了多态性并违反了 OCP,但是它在那种情况下工作得很好。
我将设计模式视为扶手,而不是手铐。