双重调度如何在访客模式中工作?

BOS*_*OSS 16 java design-patterns double-dispatch visitor-pattern

我正在研究与访问者模式相关的其他问题,但无法理解访问者模式中双重调度的实现.

请参阅访问者模式链接

双重调度如何在访客模式中工作?

Kau*_*lya 39

单分派

单一派遣

假设Node是一个接口类,两个子类是接口的具体实现.

如果GenerateCode()在节点实例上调用method,则执行的实际操作取决于节点的类型.它可能是在VariableRefNode或中的方法AssignmentNode.如果你打电话也是一样的PrettyPrint().因此,执行的实际操作取决于您调用的方法的名称节点类型.

双调度

节点 游客

这次Node允许您将类型的参数传递NodeVisitor给其调用的方法Accept.在你的程序,如果你调用Accept一个节点实例,实际操作中得到执行,现在依赖于节点的类型(VariableRefNodeAssignmentNode)访问者实例的类型,你传递给Accept(TypeCheckingVisitorCodeGeneratingVisitor).


sal*_*emi 21

元素对象的accept方法接收访问者对象,并调用visit访问者对象上的方法.由于访问者对象有多种visit方法,因此根据元素类型visit调用适当的方法.这里我们有两个调用(double dispatch),它指定元素的元素和正确的操作(基于它的类型).


Boh*_*ian 8

好吧,这是该文章的相关引用:

访客实施"双重调度".OO消息通常表现为"单一调度" - 执行的操作取决于:请求的名称和接收器的类型.在"双重调度"中,执行的操作取决于:请求的名称,以及TWO接收器的类型(访问者的类型和它访问的元素的类型).

这实质上意味着不同的访问者可以访问相同类型,并且同一访问者可以访问不同类型.正在使用访问者模式可能取决于执行命名操作的效果访问者被访问(双调度).