我正在为移动电话编写一个绘图/图形Java应用程序(因此内存有限)。应用程序状态实质上是三个1000x500位图(即绘画层)。加载三个位图大约需要2到3秒。
我正在尝试编写一个撤销引擎,但我只是想不出一个好的方法来实现它。典型的做法是:
我所有的解决方案都涉及上述模式的复杂混合体。
有人能提出一个解决方案,让我对我的应用程序进行合理的快速撤消/重做吗?
发布于 2010-07-14 21:24:58
有第三种常用的方法来处理撤销。也就是说,在Undo对象中存储这两种状态之间的差异。您可以将其作为实际差异(即哪些像素已更改和更改为哪些像素)进行处理,但这可能与在每个阶段存储位图一样浪费内存。
或者,您可以使用命令模式方法,但是在撤消时不重新运行命令,而是存储命令的逆值--也就是说,如果用户将红色值增加10,那么撤销命令将其减少10。要撤消,只需执行反向命令。有些命令很难找到反向命令,例如“转换为黑白”,但通过将底层位图与多个由命令打开或关闭的过滤器混合使用,您可能可以做到这一点。
作为另一个建议,请使用您提到的命令方法,但要为前面的步骤保留一个位图。当用户确实撤销时,立即显示上一步(n-1)中的缓存位图,然后开始计算n-2的位图,这样您就可以在他再次按撤销时准备好了。
发布于 2011-05-03 17:31:56
关于您的,使用命令模式点:从初始状态开始,然后再次执行命令是根本不需要的。如果要支持撤销操作,每个Command类都应该表示一个小的用户操作,并且应该有机制来撤消它在执行()方法中所做的事情。我们维护一个*命令对象堆栈。当用户撤消某些操作时,命令对象将从堆栈中弹出,并调用其undo()方法。
在您的情况下,我没有看到使用memento模式的任何动机,因为撤销操作将以FIFO顺序进行。我想,用户不允许随意撤销操作。
https://stackoverflow.com/questions/3250104
复制相似问题