我想实现在一个小撤销/重做涂料中的应用 。 看来命令模式非常适合使用,但我不能确定如何最好地实现它。
据我所知的图案,有必要在每个命令包括:
- 油漆操作重做的目的的细节(例如线- >开始和结束点,自由形式线- >
GeneralPath
) - 之前用于撤消该改变的组件的状态。 在这种情况下,这将是受该命令的区域的一小快照图像。
基于对我的理解是,每个命令必须是“原子”或自包含的,有需要撤销的所有信息/重做操作。
不幸的是这将需要存储比我当初预想的更多信息。 对于行中,我们还必须考虑的事情,如Color
, Stroke
和RenderingHints
最初用来绘制。 这令我“简单的小命令”到的东西在内存..更多笨重,并与多个锅炉板代码生产出(每个将是一个序列化豆1)。
用于存储器保护的原因(大部分)我是想上的命令的规格为“欺骗”。 也许把整个绘图区域每隔100个更新的备份,但在其他存储没有改变的图像的一部分,并简单地重建最后一个(最高)100级的命令为每一个新的油漆作业。 但似乎有问题,以确保状态Graphics
右侧画每一部分之前的对象是-这部分可能需要一条线,但RenderingHints
被改变4命令前, Color
改为98个命令前,而Stroke
一直保持同样在过去的227个命令。
追求更多的内存高效的指挥似乎扔图案右侧窗外在被“原子”条款。 这反过来又导致在确定可能影响呈现最早的命令困难。
我是不是该:
- 寻找新的模式?
- 尝试通过调整模式来实现我的特殊需求?
- 折腾这一切都在垃圾桶过早优化和定义它在最简单的(也是最耗费内存)的那支到命令模式,路径代码?
更新
- “每个将是一个序列化豆”在第二次思想,没有。 我做了圆顶的检查,发现在
Graphics2D
(整齐地封装在绘制时使用的许多参数)是不可序列。 此外,BasicStroke
是可序列化,但笔划的厚度不被存储。 我可以创建许多属性的序列化版本,但它似乎使了很多更多的代码,所以我打算放弃该规范。 为好。 我只会尝试存储一个参照BufferedImage
在运行时。