Java 访客设计模式

Java 访客设计模式,java,visitor-pattern,Java,Visitor Pattern,visitor设计模式的accept方法是否可能由类层次结构的根实现?在Java中,这是不可能的,因为编译器不知道绑定到哪个方法。有些语言具有基于对象的实际运行时类的动态方法绑定,而不是Java。我想说,如果Java只允许在基类中实现一次accept,那么这一事实将破坏Visitor的全部目的,对于Java和其他类似语言中丢失的多分派,这是一个非常麻烦的解决办法。从某种意义上说,是的,但是一个正确的访问者实现需要基类实现有一个if链来检查这是基类的哪个子类的实例,因为,正如其他人所指出的,访问者

visitor设计模式的accept方法是否可能由类层次结构的根实现?

在Java中,这是不可能的,因为编译器不知道绑定到哪个方法。有些语言具有基于对象的实际运行时类的动态方法绑定,而不是Java。

我想说,如果Java只允许在基类中实现一次accept,那么这一事实将破坏Visitor的全部目的,对于Java和其他类似语言中丢失的多分派,这是一个非常麻烦的解决办法。

从某种意义上说,是的,但是一个正确的访问者实现需要基类实现有一个if链来检查这是基类的哪个子类的实例,因为,正如其他人所指出的,访问者模式的目的是实现类似于多重分派的功能,这需要以某种方式区分对象的运行时类型。也就是说,您要么以正确的方式实现Visitor,在每个可以分派到的子类中都有一个accept,要么在层次结构的根中实现一个大accept,如下所示:

public void accept(Visitor visitor) {
    if (this instanceof Foo) {
        doSomething();
    } else if (this instanceof Bar) {
        doSomethingElse();
    } else ...
}

不是很漂亮吧?它违反了各种设计原则,包括正确的多态设计,这是访问者和多分派的全部要点,因此,再仔细想想,我认为调用该访问者是一种延伸。

您可以在基类中实现accept方法,但是你不能实现任何其他类,因为你只能扩展一个类,你不想因为你不想复制一个简单的单行函数而浪费它。。。Visitor不正是用来解决双重分派问题的模式吗?如果Java有双重分派,那么一开始就没有理由去打扰访问者,对吗?@MarkoTopolnik-没错。Java没有双重分派,因此需要访问者模式。出于同样的原因,accept方法不能由基类实现。GoF的书特别指出,访问者模式是实现双重分派的一种方式。是的,因此如果OP只能在基类中实现accept,那么他首先就不会实现accept——因此,再一次,他不会在基类中实现accept。这是一种类似于人择原理的循环逻辑——你这样做的唯一原因是因为你需要它在等级制度的每一步:@MarkoTopolnik——没错。如果可以做到,你就不需要做了。我认为,更像是第二十二条军规,而不是不是不是循环逻辑的人择原理。我认为你在回答中很好地说明了这一点。你可以想象accept方法会问自己为什么我在每门课上都被重新实现愚蠢的想法-如果我不是,我就不会问这个问题:最好称之为无访客模式:-不是真的!accept类获取一个访问者并调用visitors-Visite方法,它将转到您发送给它的访问者,您绝对不应该使用instanceofsee my Response,您需要多次实现accept方法并且在所有这些方法中都相同的唯一原因是,您希望使用接口,而不是仅仅为了有一个访问者而扩展类。在java中,您可以只扩展一个类,您不想因为不想复制一个简单的单行函数而浪费它