首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用memento/命令模式快速撤消/重做?

使用memento/命令模式快速撤消/重做?
EN

Stack Overflow用户
提问于 2010-07-14 20:16:43
回答 2查看 7.7K关注 0票数 7

我正在为移动电话编写一个绘图/图形Java应用程序(因此内存有限)。应用程序状态实质上是三个1000x500位图(即绘画层)。加载三个位图大约需要2到3秒。

我正在尝试编写一个撤销引擎,但我只是想不出一个好的方法来实现它。典型的做法是:

  • 使用命令模式:当您撤消时,重新加载初始文件的状态,然后重放除最后一个之外迄今为止处理的所有命令。但是,这意味着等待2或3秒来加载初始状态,这太慢了。内存中也没有足够的内存来存储初始状态。
  • 使用memento模式:在撤消时,用旧状态替换当前状态中被更改的部分。这意味着每个操作都需要将旧状态的位图保存到磁盘,因为移动设备上没有足够的内存将其存储在内存中。由于节省位图需要时间,如果用户决定快速连续地画许多笔画,我该如何处理呢?我不能让他们等我。--

我所有的解决方案都涉及上述模式的复杂混合体。

有人能提出一个解决方案,让我对我的应用程序进行合理的快速撤消/重做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-14 21:24:58

有第三种常用的方法来处理撤销。也就是说,在Undo对象中存储这两种状态之间的差异。您可以将其作为实际差异(即哪些像素已更改和更改为哪些像素)进行处理,但这可能与在每个阶段存储位图一样浪费内存。

或者,您可以使用命令模式方法,但是在撤消时不重新运行命令,而是存储命令的逆值--也就是说,如果用户将红色值增加10,那么撤销命令将其减少10。要撤消,只需执行反向命令。有些命令很难找到反向命令,例如“转换为黑白”,但通过将底层位图与多个由命令打开或关闭的过滤器混合使用,您可能可以做到这一点。

作为另一个建议,请使用您提到的命令方法,但要为前面的步骤保留一个位图。当用户确实撤销时,立即显示上一步(n-1)中的缓存位图,然后开始计算n-2的位图,这样您就可以在他再次按撤销时准备好了。

票数 10
EN

Stack Overflow用户

发布于 2011-05-03 17:31:56

关于您的,使用命令模式点:从初始状态开始,然后再次执行命令是根本不需要的。如果要支持撤销操作,每个Command类都应该表示一个小的用户操作,并且应该有机制来撤消它在执行()方法中所做的事情。我们维护一个*命令对象堆栈。当用户撤消某些操作时,命令对象将从堆栈中弹出,并调用其undo()方法。

在您的情况下,我没有看到使用memento模式的任何动机,因为撤销操作将以FIFO顺序进行。我想,用户不允许随意撤销操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3250104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档