访客模式

在这篇文章中,我将描述一种名为“Visitor”的设计模式。或“访客”
此模式属于行为模式组。

让我们提出一个问题

该模式主要用于绕过早期绑定语言中单次调度的限制。

爱丽丝 X 作者 NFGPhoto (CC-2.0)
让我们创建一个抽象类/协议 Band,创建 MurpleDeep 的子类,创建一个具有两个方法的 Visitor 类 –一个用于将 Band 的任何后代输出到控制台,第二个用于输出任何 MurpleDeep,主要是方法的名称(签名)相同,参数仅因类而异。使用带 Band 参数的中间打印输出方法,我们创建一个 Visitor 实例并调用 MurpleDeep 的访问方法。
下面是 Kotlin 中的代码:

输出将为“这是 Band 类

这怎么可能?!

许多文章(包括俄语)都用巧妙的文字描述了为什么会发生这种情况,但我建议您想象一下编译器如何看待代码,也许一切都会立即变得清晰:

解决问题

有很多解决方案可以解决这个问题,接下来我们将考虑使用访问者模式的解决方案。
我们将带有 Visitor 参数的accept方法添加到抽象类/协议中,在方法内部调用visitor.visit(this),然后将accept方法的重写/实现添加到MurpleDeep类中,果断而冷静地违反了DRY,再次编写Visitor.visit(this).< br />最终代码:

来源

https://refactoring.guru/ru/设计模式/访客双调度

源代码

https://gitlab.com/demensdeum/patterns

Leave a Comment

Your email address will not be published. Required fields are marked *