访问者模式接受不识别对象的类

时间:2011-12-27 15:41:30

标签: java oop design-patterns visitor-pattern

我想使用访问者模式来实现树。所以我创建了一个主类Node和其他扩展该类的类(例如Node1Node2Node3)。在Node中,我有一个字符串和一个ArrayList Nodes,它是该节点的子节点列表。所以我实现了一个包含3个函数visit(Node1 x)的访问者,...在main中我想要接受每个节点:

SomeVisitor v = new SomeVisitor();
Node n = makeTree();
Iterator<? extends Node> it = n.children.iterator();
while(it.hasNext()) {
    System.out.println(it.next().getClass());

    it.next.accept(v); 
}

这不起作用,因为即使.getClass返回特定的类 我的意思是节点1,2或3,我得到的错误是it.next是一种类型 节点,但我的树中没有任何节点对象,我没有实现 visit(Node)visit(Node 1,2,3)

3 个答案:

答案 0 :(得分:2)

检查visitor pattern的说明。 accept方法应该在基类中声明,每个子类都应该通过调用相应的visit方法来覆盖它:

public abstract class Node {
    public abstract void accept(Visitor v); 
}

public class Node1 extends Node {
    @Override
    public void accept(Visitor v) {
        v.visit(this); // calls visit(Node1)
    }
}

答案 1 :(得分:0)

您的解决方案是使用访问者模式,这不是您似乎正在做的事情。

  

我没有实现访问(Node)访问(节点1,2,3)

这是你的问题。您必须使用与您调用的方法相同的方法实现相同的接口。

你还需要把它写成

v.visit(it.next());

@JB Nizet的解决方案类似,但我认为以一种从一开始就需要调用的方式编写代码更简单。

答案 2 :(得分:0)

很难猜出你的问题在哪里。您应该看一下wikipedia上的示例实现。正如您将看到的那样,使用扩展而不是使用装饰接口来实现模式。