Visitor-访问者 ############## .. note:: separates an algorithm from an object structure by moving the hierarchy of methods into one object. Allows for one or more operation to be applied to a set of objects at runtime, decoupling the operations from the object structure. 允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。 所谓 Single Dispatch:: 指的是执行哪个对象的方法,根据对象的运行时类型来决定; 执行对象的哪个方法,根据方法参数的『编译时』类型来决定。 所谓 Double Dispatch:: 指的是执行哪个对象的方法,根据对象的运行时类型来决定; 执行对象的哪个方法,根据方法参数的『运行时』类型来决定。 如何理解 “Dispatch” 这个单词呢:: 在面向对象编程语言中,我们可以把方法调用理解为一种消息传递,也就是 “Dispatch”。 一个对象调用另一个对象的方法,就相当于给它发送一条消息。这条消息起码要包含对象名、方法名、方法参数。 如何理解 “Single”“Double” 这两个单词呢:: “Single”“Double” 指的是执行哪个对象的哪个方法,跟几个因素的运行时类型有关。 进一步解释: Single Dispatch 之所以称为 “Single”,是因为执行哪个对象的哪个方法, 只跟 “对象” 的运行时类型有关。 Double Dispatch 之所以称为 “Double”,是因为执行哪个对象的哪个方法, 跟 “对象” 和 “方法参数” 两者的运行时类型有关。