访问者如何以迭代器没有的方式"定义新操作"?

Tob*_*ber 4 java algorithm iterator design-patterns visitor

我经常知道并使用迭代器和访问者,并且在我听说四人帮的设计模式之前就已经使用过它们.虽然两种模式的语法差异很大,但我将两者用于同一个概念目标:遍历一组对象.粗略地说,当我有相同类型的非结构化对象时,我使用迭代器,当我构建不同类型的对象时,我使用访问者.对我来说,访客只是一个优雅,花哨,强大的类型迭代器.

当我阅读设计模式时,我注意到访问者的描述,特别是它与迭代器描述的不同之处.

访问者允许您定义新操作,而无需更改其操作的元素的类

迭代器:提供一种顺序访问聚合对象元素的方法,而不暴露其底层表示.

我已经考虑过了,我无法弄清楚访客如何定义新操作.

例如,我想要实现一个相当简单的操作,比如toLocalizedString()作为本地化的替代toString().将访问者传递给元素时,它将遍历该对象的整个子结构.此外,您无法从接受/访问方法返回任何内容.这些特征中的每一个都阻止我使用访问者来定义toLocalizedString().

这带来了我的问题:访问者如何以迭代器没有的方式"定义新操作"?如果我相信Gang of Four的描述,我觉得我错过了访客模式的真正力量.

das*_*ght 5

遍历结构不是访客模式的定义特征.实际上,人们可以想到您使用访问者来遍历具有结构的对象作为花哨的迭代器.

访问者与迭代器的区别在于访问者允许您执行所谓的Double Dispatch,即将消息路由到一个方法,该方法既依赖于被访问对象的运行时类型,又依赖于访问者对象.被访问的对象在访问者外部,但操作的可执行代码包含在访问者中.换句话说,遵循访问者模式允许您执行被访问对象外部的操作,这可以被认为是在对象上定义新操作.