简单的实现了一下控制反转,将各个visitor访问代码分不到不同的visitor类中
visitor-->node
private static Map<Class<?>, AbstractNodeVisitor<IPigBuilder>> visitMap;
static {
visitMap = new ConcurrentHashMap<Class<?>,AbstractNodeVisitor<IPigBuilder>>();
visitMap.put(FilterNode.class, new FilterNodeVisitor());
visitMap.put(GroupNode.class, new GroupNodeVisitor());
visitMap.put(JoinNode.class, new JoinNodeVisitor());
visitMap.put(StoreNode.class,new StoreNodeVisitor());
visitMap.put(LoadNode.class, new LoadNodeVisitor());
visitMap.put(DBStoreNode.class, new DBStoreNodeVisitor());
visitMap.put(DBLoadNode.class, new DBLoadNodeVisitor());
visitMap.put(OrderByCnd.class, new OrderByNodeVisitor());
}
@Override
public IPigBuilder visit(AbstractNode node) throws NodeErrorException {
if (!visitMap.containsKey(node.getClass())) {
return null;
}
AbstractNodeVisitor<IPigBuilder> visitor = visitMap.get(node.getClass());
return visitor.visit(node);
}