Tag: 访问者

访问者模式对动态类型语言有用吗?

访问者模式允许在不扩展对象类的情况下编写对象上的操作。 当然。 但是为什么不编写一个从外部操作我的对象集合的全局函数或静态类呢? 基本上,在像java这样的语言中,出于技术原因需要accept()方法; 但是在一种我可以在没有accept()方法的情况下实现相同设计的语言中,访问者模式是否变得微不足道? 说明:在访问者模式中,可访问的类(实体)有一个方法.accept()其作用是调用访问者的.visit()方法。 我可以看到java示例的逻辑:访问者为它支持的每个可访问类型定义了一个不同的.visit(n)方法,并且必须使用.accept()技巧在运行时选择它们。 但是像python或php这样的语言有动态类型,没有方法重载。 如果我是访问者,我可以在不知道实体的类型甚至方法的完整签名的情况下调用实体方法(例如, .serialize() )。 (这是“双重调度”问题,对吧?) 我知道一个接受方法可以将受保护的数据传递给访问者,但有什么意义呢? 如果数据公开给访问者类,它实际上是类接口的一部分,因为它的详细信息在类之外很重要。 无论如何,公开私人数据从来没有让我感到自己是访客模式的重点。 因此,似乎在python,ruby或php中我可以在访问对象中没有接受方法(并且没有reflection)的情况下实现类似访问者的类,对吧? 如果我可以使用一系列异构对象并在没有“访问”类的任何合作的情况下调用他们的公共方法,那么这仍然应该被称为“访问者模式”吗? 是否存在一些我缺失的模式的本质,或者它是否只是归结为“编写一个从外部操作对象来执行操作的新类”? PS。 我已经看过很多关于SO和其他地方的讨论,但找不到任何解决这个问题的东西。 指针欢迎。