对访问者模式(Visitor)的疑问?
要实现Visitor模式,得为访问者建立一个Visitor接口,还要为被访问的集合建立一个Visitable接口。然后,让具体类实现Visitor和Visitable接口。这两个接口如下所示:
public interface Visitor
{
public void visitCollection(Collection collection);
public void visitString(String string);
public void visitFloat(Float float);
}
public interface Visitable
{
public void accept(Visitor visitor);
}
对于具体的String,可能是这样:
public class VisitableString implements Visitable
{
private String value;
public VisitableString(String string) {
value = string;
}
public void accept(Visitor visitor) {
visitor.visitString(this);
}
}
在accept方法中,对this类型调用正确的visitor方法:
visitor.visitString(this)
这样,就可以如下实现具体的Visitor:
public class PrintVisitor implements Visitor
{
public void visitCollection(Collection collection) {
Iterator iterator = collection.iterator()
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof Visitable)
((Visitable)o).accept(this);
}
public void visitString(String string) {
System.out.println("""+string+""");
}
public void visitFloat(Float float) {
System.out.println(float.toString()+"f");
}
}
问题:在VisitableString类别中,方法:
public void accept(Visitor visitor) {
visitor.visitString(this);
}
是否是错误的?在Visitor接口中visitString方法接收的是String类型,为什么这里用this?