这次实验主要是实现多次redo和undo,即程序的撤回和恢复,这里只实现加法的撤回和恢复。
程序的撤回和恢复就是由所使用的软件来记录操作步骤,可以将数据恢复到某个操作状态。
撤回这个指令很常见,Windows系统常用的快捷键ctrl+z就可以实现撤回的效果
恢复目前只在word等文档编辑软件见到。
首先说一下命令模式的结构(参考该类图,使用starUML制作):
Adder类是加法的计算和返回计算后的结果, AbstrCommand是抽象类,定义三个抽象方法,AddCommand类继承AbstrCommand类,对AbstrCommand进行扩展,
这样就可以灵活的改变命令的内容,和添加新命令。CalculatorForm类是调用AbstrCommand的方法,实现操作,并对操作的结果进行处理。通过该结构可以完成撤回和
回复的实现。
该结构又优点,这样设计降低了系统的耦合度,也方便加入新命令。
接下来说一下算法实现的原理:
首先要想撤回和恢复的实现,需要有两个栈(链表也可以),一个栈用来存储操作的每个步骤的结果,命名为撤回栈,另一个表用来
存储撤回栈弹出的数据,命名为恢复栈。在进行加法操作的时候需要在将最新的结果压入撤回栈(保存最新操作),恢复栈清空(每次进行加法操作,
需要清空撤回栈弹出的数据),在撤回栈的时候需要将撤回栈的栈顶弹出,并将其压入恢复栈(保存),在恢复时需要将恢复栈的栈顶弹出,并将其
压入撤回栈,这样就完成了基本的实现,不要忘了再加上栈的空的判断。
栈的使用:stack<Object> stack = new Stack<Object>(); 定义 (说明类型)
Object j=stack.peek(); 返回栈顶元素的值
Object j=stack.pop(); 弹出栈顶元素的值,j是弹出的值
Object j=stack.push(Object element); 将值压入栈
源代码:
//实现加法的计算和返回计算的值
1 public class Adder { 2 private int num =0; 3 public int add(int value) { 4 num+=value; 5 return num; 6 } 7 }