superclass使用visitor模式

被访问者希望在超类中统一接收visitor访问,但不做任何处理的情况下,visitor访问的方法是访问超类参数的方法。

 

解决这种情况有两种方法:

1)被访问者具体overwrite接收visitor的访问方法

2)超类使用反射

 

第一种方法,如果被访问的子类太多,很罗嗦。

第二种方法,简洁,但有性能问题。

 

增加子类,不要忘记增加visitor的访问接口。

 

第二种方法示例:

 

public interface Visitor{ void visit(SuperClass s); void visit(A a); void visit(B b); //新增被访问者时在此添加对应的访问方法 } public interface Visitable{ void accept(Visitor visitor); } public class SuperClass implements Visitable{ public void accept(Visitor visitor){ //不能使用visitor.visit(this),这样会导致编译时绑定,始终调用visit(Superclass)的方法。 doVisit(visitor,this); } //反射调用 private void doVisit(Visitor visitor, Object target) { try { Method m = visitor.getClass().getMethod("visit", new Class[] { target.getClass() }); m.invoke(visitor, tag); } catch (Exception e) { throw new RuntimeException(e); } } } public class A extends SuperClass{ //不再需要实现accept方法 } public class B extends SuperClass{ } 

你可能感兴趣的:(superclass使用visitor模式)