我会像这样解决.基本上会有三个列表.
>具有实际值的列表
>撤销具有Command接口实例的列表
>具有Command接口实例的重做列表(可选,下面说明)
public interface Command {
void do();
void undo();
}
将有两个Command实现:AddCommand和RemoveCommand.
>在add()中,AddCommand的新实例创建并添加到撤消列表中.然后我们调用这个命令的do(),它修改实际值并存储添加项的索引.
>在remove()中,创建并添加到撤销列表中的RemoveCommand的新实例.然后我们调用这个命令的do(),它修改实际值并存储已删除项的索引和值.
> undo()我们从undo列表中拉取最后一个命令,并执行该命令的undo()方法.该命令推送到重做列表. AddCommand和RemoveCommand的撤消方法可以恢复更改.
>重做()我们从重做列表中拉出最后一个命令,并再次执行do()方法. Pulled命令被添加到撤消列表.
另一个优化是删除重做列表,并使用undo index.在这种情况下,当您撤消()时,您不需要从列表中删除/添加值,而只需将undo索引减1.类似地,redo()会增加一个.
因此,最终解决方案将具有值列表,撤销列表和索引值.
更新:
对于最简单的情况,只需要一个undo()/ redo()操作,解决方案看起来会更加简单.而不是具有撤消列表和索引,它足以存储最新的命令实例.因此,我们将有一个值列表和最后一个undo命令的实例.