几个星期前在看前辈的redo/undo总结,这次终于可以自己试试这个命令式redo/undo的写法了。
命令式redo/undo主要有三个部分;
1,ICommand;(命令作用的对象,excute,undo,redo,还有一些Undo,redo参数变量)
2,commandStack;(存储命令的栈,undo和redo都在这栈里面上下走)
3,通道,也可以说是触发器,把命令放进commandStack里面
这种方式其实和ACM的一些水题很类似,练习堆栈的操作。
其中注意几点小问题:
1,当执行完undo/redo之后,再执行excute时,则_index之后的命令全部清除;以WPS或者WORD为例,都有这样的操作。其实这里面的思想很是奇特,如果我不清空后面的内容呢?就好象画一个圆,画到四分之三的时候,突然画出得不好了,要重新从四分之三来画,当画完四分之一再执行一次Undo的时候,也就是还要再跑到那个画得不好的地方然后再返回四分之三的地方,也就是那个不好的地方其实在undo的时候已经被定位为无用的数据,所以可以不要,所以才会在执行excute的时候大胆地把后面的数据不要。这个有点牵涉到人的使用心理。当人们会使用撤销这个操作时,说明当前的数据已经为错误,无用的,所以当然是要放弃的。突然很是震撼这个功能,很是钦佩总结这个功能的人。
2,一个越界的问题。越界在这里显得尤为明显。而且容易出错。
插入栈的结点,可以实现一个操作实现多个命令
边界处理问题
3,键盘行为操作;
快捷键这里设置依据之前华哥框架里面的鼠标行为,思考了下ctrl+c/ctrl+v的行为,先是按下control然后再c/v,所以在keyup的时候判断ctrl有没有Up,没有的话表示粘帖复制行为仍存在。所以加多个变量保存ctril是否存在,这样几个消息流下来后就可以判断这个行为了。很是精彩。。。。