终于将项目的 undo / redo 的模块对应完毕,松了口气。
与
以前的实现方式的描述略有不同,在实现中我采取了并不删除实际的实体,而是存储了要删除对象的指针,比如,在删除时,假设实体对象是用链表来存储的,修改前结点的 next 指针指向当前结点的后续。当前结点的指针不要释放,而是作为 undo 的参数存储起来,这样在 undo 时,只用恢复原来的链接状态就 OK 了; redo 的时候还是修改指针。
这样会带来的一个负面的效应是,随着实体对象越来越多,内存的消耗也会增大;
对于删除了对象,而内存并没有释放而带来的这种负面情形,我们可以通过设定栈的大小来解决,当栈增长到最大长度时再做实际的实体删除操作,并释放其对应的内存。
记得当初做 AutoCAD 的开发时,AutoCAD 的实体操作好像也是采用这种方式来做的,他的删除也是只是在当前的数据库中做了一下标记。
阅读(1804) | 评论(1) | 转发(0) |