当前位置: 首页 > 面试题库 >

使用记忆/命令模式快速撤消/重做?

翟修永
2023-03-14
问题内容

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

我正在尝试编写一个撤消引擎,但是我无法解决这个问题。典型的方法是:

  • 使用命令模式:撤消时,您将重新加载初始文件的状态,然后回放到目前为止已处理的所有命令(最后一个命令除外)。天真地执行此操作意味着要等待2或3秒钟才能加载太慢的初始状态。也没有足够的内存来将初始状态存储在内存中。

  • 使用记忆模式:撤消操作时,将当前状态的已更改部分替换为旧状态。这意味着每个动作都需要将旧状态的位图保存到磁盘,因为移动设备上没有足够的内存来将其存储在内存中。由于保存位图需要花费时间,如果用户决定快速连续绘制许多笔触,该如何应对?我不能让他们等待。

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

谁能建议一个解决方案,使我能够对应用程序进行相当快速的撤消/重做?


问题答案:

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

另外,您也可以使用命令模式方法,但是在存储撤消命令时,您无需存储命令的倒数,而无需重新运行命令,即,如果用户将红色值增加了十,那么撤消命令就是将其减少十。
。要撤消操作,只需执行反命令即可。很难找到某些命令的反函数,例如“转换为黑白”,但是通过将基础位图与许多由命令打开或关闭的过滤器混合,您可能可以做到。

作为另一建议,请使用您提到的命令方法,但请保留上一步的位图。当用户撤消操作时,立即显示上一步(n-1)中缓存的位图,然后开始计算n-2的位图,以便您准备好再次按下undo时。



 类似资料:
  • 问题内容: 我正在实现撤消/重做功能,这需要我使用记忆模式。 局部程序的流程:“ …该程序然后使用Memento模式存储先前的Vector,然后将新创建的对象添加到Vector。此后,用户可以选择show命令来显示Vector内部的内容。 ,他还可以输入undo命令来还原,还原可以重复进行,直到还原到原始状态为止。” 从我的研究中,我知道将会有一个创始者,纪念品和看守。 这是我的看守程序 不幸的是

  • 我目前正在Mac上使用Eclipse版本:2020-06(4.16.0)。当我去日食

  • 问题内容: 任何人都可以用简单的命令模式示例来解释。我在互联网上指称,但我感到困惑。 问题答案: 在大多数情况下,命令是不可变的,并且包含封装了按需执行的单个动作的指令。您可能还具有一个RuntimeCommand,该RuntimeCommand在执行时接受指令,但是根据实现的不同,它会更深入地研究Strategy或Decorator模式。 我个人认为,注意命令的不变上下文非常重要,否则命令将成为

  • 主要内容:介绍,实现,Order.java,Stock.java,BuyStock.java,SellStock.java,Broker.java,CommandPatternDemo.java命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决

  • 命令模式 亦称:动作、事务、Action、Transaction、Command 意图 命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。 问题 假如你正在开发一款新的文字编辑器, 当前的任务是创建一个包含多个按钮的工具栏, 并让每个按钮对应编辑器的不同操作。 你创建

  • 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记