游客设计模式

时间:2012-05-13 21:27:22

标签: java visitor-pattern

访问者设计模式的accept方法是否可以由类层次结构的根实现?

4 个答案:

答案 0 :(得分:1)

我会说如果Java允许你只在基类中实现accept一次,那么这个事实就会破坏Visitor的整个目的,这对于丢失的多个调度来说是一个非常麻烦的解决方法。 Java和其他类似语言。

答案 1 :(得分:0)

从某种意义上讲,是的,但正确的访客实现将要求您的基类实现具有if链,该链检查基类this的哪个子类是其实例,因为,和其他人一样已经指出,访问者模式的目的是实现多重调度,这需要以某种方式区分对象的运行时类型。即,您可以以“正确”的方式实现Visitor,在每个可以分派的子类中使用accept(),或者在层次结构的根中实现一个大accept(),如下所示: p>

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

不是很漂亮,是吗?它违反了各种设计原则,包括适当的多态设计,这是访问者和多次发送的全部要点,所以在第二个想法中,我认为完全称之为访问者是一种延伸。

答案 2 :(得分:0)

你可以在基类中实现accept方法,但是你不能实现任何其他类,因为你只能扩展一个类,你不想浪费它只是因为你不想复制一个简单的一行函数

答案 3 :(得分:-1)

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