对于撤销/重做在涂料中的应用命令模式(Command Pattern for undo/redo i

2019-08-01 06:23发布

我想实现在一个小撤销/重做涂料中的应用 。 看来命令模式非常适合使用,但我不能确定如何最好地实现它。

据我所知的图案,有必要在每个命令包括:

  1. 油漆操作重做的目的的细节(例如线- >开始和结束点,自由形式线- > GeneralPath
  2. 之前用于撤消该改变的组件的状态。 在这种情况下,这将是受该命令的区域的一小快照图像。

基于对我的理解是,每个命令必须是“原子”或自包含的,有需要撤销的所有信息/重做操作。

不幸的是这将需要存储比我当初预想的更多信息。 对于行中,我们还必须考虑的事情,如ColorStrokeRenderingHints最初用来绘制。 这令我“简单的小命令”到的东西在内存..更多笨重,并与多个锅炉板代码生产出(每个将是一个序列化豆1)。

用于存储器保护的原因(大部分)我是想上的命令的规格为“欺骗”。 也许把整个绘图区域每隔100个更新的备份,但在其他存储没有改变的图像的一部分,并简单地重建最后一个(最高)100级的命令为每一个新的油漆作业。 但似乎有问题,以确保状态Graphics右侧画每一部分之前的对象是-这部分可能需要一条线,但RenderingHints被改变4命令前, Color改为98个命令前,而Stroke一直保持同样在过去的227个命令。

追求更多的内存高效的指挥似乎扔图案右侧窗外在被“原子”条款。 这反过来又导致在确定可能影响呈现最早的命令困难。

我是不是该:

  • 寻找新的模式?
  • 尝试通过调整模式来实现我的特殊需求?
  • 折腾这一切都在垃圾桶过早优化和定义它在最简单的(也是最耗费内存)的那支到命令模式,路径代码?

更新

  1. “每个将是一个序列化豆”在第二次思想,没有。 我做了圆顶的检查,发现在Graphics2D (整齐地封装在绘制时使用的许多参数)是不可序列。 此外, BasicStroke 可序列化,但笔划的厚度不被存储。 我可以创建许多属性的序列化版本,但它似乎使了很多更多的代码,所以我打算放弃该规范。 为好。 我只会尝试存储一个参照BufferedImage在运行时。

Answer 1:

我要坚持命令图案和第一尝试幼稚溶液(=最存储器饥饿)。 对于某些图形操作,可能甚至是必要的,以保持整个图像的副本在命令对象(例如,想到的过滤器)。 这是一个常见的问题也在专业的图像编辑应用程序,他们往往能记忆的最后命令的内存或台阶限制。 如果内存消耗是真正的大你可能会想换入命令历史上最古老的条目到文件系统中。 我认为,直到更改撤销的用户不会介意等待一秒钟。



Answer 2:

也许,这将是最好不要存储整个图像的拷贝命令,但只存储区,这是由命令改变的副本。 当然,这也不是万能的



文章来源: Command Pattern for undo/redo in paint application