您何时决定将访客用于您的对象?

unj*_*nj2 15 java design-patterns traversal visitor

我一直认为对象需要数据和消息来对其进行操作.你什么时候想要一个对象的外在方法?有一个经验法则,你有一个访客?这假设您可以完全控制对象图.

Mic*_*yan 7

当将操作应用于相当复杂的数据结构的所有元素时,访问者模式特别有用,其中遍历是非平凡的(例如,并行遍历元素,或遍历高度互连的数据结构)或实现双重调度.如果要按顺序处理元素并且不需要双重调度,那么实现自定义Iterable和Iterator通常是更好的选择,特别是因为它更适合其他API.

  • 这个答案是完全正确的,但对于那些不熟悉访客模式及其使用方式的人来说,可能是希腊语. (2认同)

ewe*_*nli 6

我一直认为对象需要数据和消息来对其进行操作.你什么时候想要一个对象的外在方法?有一个经验法则,你有一个访客?这假设您可以完全控制对象图.

在一个类中定义特定对象的所有行为有时不方便.例如在Java中,如果你的模块需要一个方法toXml在最初在另一个模块中定义的一堆类中实现,那么它很复杂,因为你不能写toXml原始类文件以外的地方,这意味着你无法在不改变的情况下扩展系统现有来源(在Smalltalk或其他语言中,您可以将扩展中的方法分组,这些方法与特定文件无关).

更一般地说,静态类型语言在(1)向现有数据类型添加新函数,以及(2)添加支持相同函数的新数据类型实现(称为表达式问题(维基百科页面))之间存在紧张关系.

面向对象的语言在第2点表现优异.如果您有一个界面,您可以安全,轻松地添加新的实现.功能语言在第1点表现优异.它们依赖于模式匹配/ ad-hoc多态/重载,因此您可以轻松地向现有类型添加新功能.

访问者模式是支持1点在面向对象的设计方式:您可以轻松地扩展,在一个类型安全的方式新的行为(如果你做种手动模式相匹配的这不会是这样的系统if-else-instanceof,因为如果案件没有被覆盖,语言永远不会警告你.

然后通常在有一组固定类型的已知类型时使用访问者,我认为这是"完全控制对象图"的意思.示例包括解析器中的标记,具有各种类型节点的树以及类似情况.

总而言之,我会说你的分析是正确的:)

PS:访客模式适用于复合模式,但它们也可以单独使用