使用Java

时间:2016-05-12 15:21:22

标签: java design-patterns

我想获得一个树路径的漂亮打印以及包含每个节点的id的路径。所以基本上我想实现一个创建两个结果的访问者。

我创建了以下代码变体,其中所有变体都将树向上遍历到根,以获得所需的结果路径:

while(node.getParent().isPresent()) {
  displayPath += node.getParent().getDisplayName();
  idPath += Integer.toString(node.getParent().getId());
}

将Node作为

class Node {
  private Optional<Node> parent;
  private String displayName;
  private int Id;

  //constructor and getters
}

变体1

class Visitor {
  private String displayPath;
  private String idPath;

  Visitor(Root root) {
    visit(root);
  }

  private void visit(Node node) {
    // traverse Tree and set displayPath and idPath
  }

  //getters for displayPath and idPath
}

变体2

class Visitor {
  private String displayPath;
  private String idPath;

  public void visit(Node node) {
    // traverse Tree and set displayPath and idPath
  }

  //getters for displayPath and idPath
}

变体3

class Visitor {
  public PathPair visit(Node node) {
    // traverse Tree and create a PathPair to return
  }
}

class PathPair {
  private String displayPath;
  private String idPath;

  PathPair(String displayPath, String idPath) {
    this.displayPath = displayPath, this.idPath = idPath;
  }

  //getters for PathPair
}

我已经考虑过这些变种: 1.确保只在访问完成后调用getter,但它会创建大量的Objects并且对用户来说有点不直观(为什么Instance创建已经访问了root?)。

  1. 有人可以根据另一次root访问的结果调用getter。这似乎是一个危险的选择。

  2. 在我看来,似乎最清楚并避免错误。

  3. 我想知道我是否忽略了潜在的第四种选择以及我对这三种变体的看法是否正确。谢谢。

1 个答案:

答案 0 :(得分:0)

对于这种情况,我通常会向访问者类添加一个静态方法:a)创建访问者实例,b)在模型图上执行它,以及c)返回值对象。这类似于变体1,但对于用户来说比使构造函数隐式执行访问更直观。

class Visitor {
    public static Visitor giveResultFor(Node node) {
        Visitor visitor = new Visitor();
        visitor.visit(node);
        return visitor; // Or extract the result of visitor and
                        // return that instead of the visitor itself
    }

    /////////////////////////////////////////////////////

    private String displayPath;
    private String idPath;

    private Visitor() {}

    private void visit(Node node) {
        // traverse Tree and set displayPath and idPath
    }

    //getters for displayPath and idPath
}