Design 2 example (1)
interface ASTVisitor {
   visitAssign(Assign a);
   visitCall(Call c);
   ...
}
class Assign
{
   Exp left;
   Exp right;
   ...
   accept(ASTVisitor v) {
     left.accept(v);
     right.accept(v);
     v.visitAssign(this);
   }
}