使用undo / redo在命令模式中移动历史记录?

时间:2016-07-15 10:35:27

标签: java arrays history undo command-pattern

我遇到了关于具有撤消/重做功能的命令模式的问题。简单的问题是,当我的历史记录已满时,我想从历史记录中删除最近最少使用的命令,并在执行时添加新命令。

我从教授那里得到了这段代码:

public class CommandHistory implements CommandInterface{

private static final int MAX_COMMANDS = 2;

private Command[] history = new Command[MAX_COMMANDS];


private int current = -1;

@Override
public void execute(Command command) {
    current++;

    if (current == MAX_COMMANDS){                     // if full, then shift
        for (int i = 0; i < MAX_COMMANDS - 1; i++){
            history[i] = history[i+1];
        }

    }
    history[current] = command;
    history[current].execute();
}

非常怀疑 if-clause 是不正确的,因为当前命令索引保持为2并且只有索引0处的命令转移到1.但他说这是要走的路。我错过了什么?

1 个答案:

答案 0 :(得分:0)

循环本身很好,但有两个问题:

  1. 你是完全正确的,当current == MAX_COMMANDS为真并且你进行循环时,current是不正确的,需要调整。

  2. 从维护角度来看,current == MAX_COMMANDS是错误的比较,它应该是current == history.length。 (否则,很容易将history的初始化更改为使用MAX_COMMANDS以外的其他内容,但忘记更改current == MAX_COMMANDS之类的每项检查。)

  3. 我会在增加之前检查current ,只有在你没有向内移动内容时才增加它:

    public void execute(Command command) {
    
        if (current == history.length - 1){                     // if full, then shift
            for (int i = 0; i < history.length - 1; i++) {
                history[i] = history[i+1];
            }
        } else {
            current++;
        }
        history[current] = command;
        history[current].execute();
    }