重构树的递归修改

3
如何重构以下代码:
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()看起来非常相似。在这种情况下,有没有不重复代码的方法?

2个回答

3
你可以使用访问者模式
interface NodeHandler {
    public void handleNode(Node node);
}

class ModifyTree{
    private void handleNodeAndChildren(NodeHandler nodeHandler, Node node) {
        nodeHandler.handleNode(node);
        for(Node child : node.getChildren()) 
            handleNodeAndChildren(nodeHandler, child);
        }
    }

    public void doActionsOnTree(Tree tree) {
        handleNodeAndChildren(new NodeHandler() { public void handlNode(Node n) {/* code for raction1 goes here*/}}, tree.getRoot());
        handleNodeAndChildren(new NodeHandler() { public void handlNode(Node n) {/* code for raction2 goes here*/}}, tree.getRoot());
    }
}

1
您可以将action1action2转换为对象:

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);
    }
}

如果想了解更一般的版本,请查看访问者模式


你的答案和我差不多,但你正确地说出了这是访问者模式 :) - Aleksander Blomskøld
@AleksanderBlomskøld - 确实,答案差不多。不过你回答得更快,所以给你点赞。 :) 我认为命令模式也非常适合这种情况。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接