【发布时间】:2010-09-08 03:55:58
【问题描述】:
我正在为土木工程应用程序编写结构建模工具。我有一个代表整个建筑的巨大模型类,其中包括节点、线元素、负载等的集合,它们也是自定义类。
我已经编写了一个撤消引擎,它在每次修改模型后保存一个深拷贝。现在我开始思考我是否可以用不同的方式编码。除了保存深层副本,我也许可以保存每个修改器操作的列表以及相应的反向修改器。这样我就可以将反向修饰符应用于当前模型以撤消,或将修饰符应用于重做。
我可以想象您将如何执行更改对象属性等的简单命令。但是复杂命令呢?就像在模型中插入新的节点对象并添加一些保持对新节点的引用的线对象。
如何实施?
【问题讨论】:
-
如果我添加评论“撤消算法”,那么我可以搜索“撤消算法”并找到它吗?这就是我搜索的内容,我发现了一些作为重复项关闭的内容。
-
hay,我也想在我们正在开发的应用程序中开发undo/redo。我们使用QT4框架,需要有很多复杂的undo/redo动作..我想知道,你使用Command成功了吗-模式?
-
@umanga:它奏效了,但并不容易。最困难的部分是跟踪参考资料。例如,当一个框架对象被删除时,它的子对象:节点、作用于它的负载以及许多其他用户分配需要保留,以便在撤消时重新插入。但是其中一些子对象与其他对象共享,撤消/重做逻辑变得相当复杂。如果模型不是那么大,我会保留纪念品的方法;它更容易实现。
-
这是一个有趣的问题,想想源代码仓库是如何做到的,比如 svn(它们保持提交之间的差异)。
标签: design-patterns undo