我知道并经常使用迭代器和访问者,而且在我听说四人帮的设计模式之前就一直在使用它们。尽管这两种模式的语法非常不同,但我将它们用于相同的概念目标:遍历一组对象。粗略地说,当我有相同类型的非结构化对象时,我使用迭代器,而当我有不同类型的结构化对象时,我使用访问者。对我来说,访问者只是一个优雅的、花哨的、更强大的类型迭代器。
当我阅读设计模式时,我注意到访问者的描述,尤其是它与迭代器描述的不同之处。
Visitor 允许您在不更改其操作的元素的类的情况下定义新操作
迭代器:提供一种顺序访问聚合对象的元素而不暴露其底层表示的方法。
从那以后我一直在考虑它,但我无法真正弄清楚访问者如何定义新操作。
例如,如果我想实现一个相当简单的操作,比如toLocalizedString()
作为toString()
. 当您将访问者传递给元素时,它将遍历该对象的整个子结构。此外,您不能从接受/访问方法返回任何内容。这些特征中的每一个都阻止我使用访问者来定义toLocalizedString()
.
这带来了我的问题:访问者如何以迭代器没有的方式“定义新操作”?如果我相信四人帮的描述,我觉得我错过了访问者模式的真正力量。