要在不改变抽象访问者的情况下,从void-visitor返回数据,可以使用回调函数来实现。具体步骤如下:
public interface Visitor {
void visit(ElementA elementA);
void visit(ElementB elementB);
// ...
}
public abstract class Element {
public abstract void accept(Visitor visitor);
}
public class ElementA extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ElementB extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public interface DataCallback {
void onDataReceived(Object data);
}
public interface Visitor {
void visit(ElementA elementA);
void visit(ElementB elementB);
// ...
void visitWithCallback(Element element, DataCallback callback);
}
public class ConcreteVisitor implements Visitor {
// ...
@Override
public void visitWithCallback(Element element, DataCallback callback) {
if (element instanceof ElementA) {
// 访问ElementA并获取数据
Object data = ...;
callback.onDataReceived(data);
} else if (element instanceof ElementB) {
// 访问ElementB并获取数据
Object data = ...;
callback.onDataReceived(data);
}
// ...
}
}
public class Client {
public static void main(String[] args) {
Element element = new ElementA();
Visitor visitor = new ConcreteVisitor();
DataCallback callback = new DataCallback() {
@Override
public void onDataReceived(Object data) {
// 处理返回的数据
}
};
element.accept(visitor.visitWithCallback(element, callback));
}
}
通过以上步骤,我们可以在不改变抽象访问者的情况下,通过回调函数从void-visitor中获取返回的数据。
下一篇:不改变代码的情况下获得随机准确性