Java 重构树的递归修改

Java 重构树的递归修改,java,recursion,refactoring,tree-traversal,Java,Recursion,Refactoring,Tree Traversal,如何重构以下代码: class ModifyTree{ public void doActionsOnTree(Tree tree) { rAction1(tree.getRoot()); rAction2(tree.getRoot()); } private void action1(Node node) { // do something with node; } private void actio

如何重构以下代码:

class ModifyTree{
    public void doActionsOnTree(Tree tree) {
        rAction1(tree.getRoot());
        rAction2(tree.getRoot());
    }

    private void action1(Node node) {
        // do something with node;
    }

    private void action2 (Node node) {
        // do something with node
    }

    private void rAction1(Node node) {
        action1(node);
        for(Node nodeIterator : node.getChildren())
            rAction1(nodeIterator);
    }

    private void rAction2(Node node) {
        action2(node);
        for(Node nodeIterator : node.getChildren())
            rAction2(nodeIterator);
    }
}
方法
rAction1()
rAction2()
看起来非常相似。在这种情况下,有没有办法不重复代码?

您可以使用:


您可以将
action1
action2
转换为对象:

interface Action {
    void doAction(Node node);
}
Action action1 = new Action() {
    @Override
    public void doAction(Node node) {
        // what used to be the body of action1()
    }
}
Action action2 = new Action() {
    @Override
    public void doAction(Node node) {
        // what used to be the body of action2()
    }
}
然后您可以编写一个递归方法:

private void rAction(Action action, Node node) {
    action.doAction(node);
    for (Node child : node.getChildren()) {
        rAction(action, child);
    }
}

关于这个想法的更一般的版本,请看一下。

关于与我相同的答案,但你正确地说这是访客模式:)@AleksanderBlomskøld-事实上,关于相同的答案。不过,你做得更快,所以对你来说+1.:)我认为命令模式也适用于此。这非常简单。谢谢你们两位!
private void rAction(Action action, Node node) {
    action.doAction(node);
    for (Node child : node.getChildren()) {
        rAction(action, child);
    }
}