我希望在一个小的绘画应用程序中实现撤销/重做。看起来命令模式非常适合这种情况,但我不确定如何最好地实现它。
据我了解,每个命令都需要包含以下内容:
1. 用于重做的绘画操作的详细信息(例如,线条->起始和结束点,自由形式线条->GeneralPath) 2. 更改前组件的状态以进行撤消。在这种情况下,将是受命令影响的区域的小快照图像。
根据我的理解,每个命令都需要“原子性”或自包含,具有所有撤销/重做该操作所需的信息。
我应该:
- 寻找新的模式吗? - 尝试通过调整模式来实现我的特殊需求吗? - 把所有这些都扔进垃圾桶里,因为这是过早的优化,并用最简单(也是最消耗内存)的方式编写符合定义的命令模式的代码?
更新
1. “每个都将是可序列化的bean” 经过第二次考虑,不是这样的。我进行了一些检查,发现一个Graphics2D(它整洁地封装了许多绘图时使用的参数)不可序列化。此外,BasicStroke是可序列化的,但未存储笔画的粗细。我可以创建许多属性的可序列化版本,但这似乎会导致更多的代码,因此我将放弃该规范。我只会尝试在运行时存储对BufferedImage的引用。
据我了解,每个命令都需要包含以下内容:
1. 用于重做的绘画操作的详细信息(例如,线条->起始和结束点,自由形式线条->GeneralPath) 2. 更改前组件的状态以进行撤消。在这种情况下,将是受命令影响的区域的小快照图像。
根据我的理解,每个命令都需要“原子性”或自包含,具有所有撤销/重做该操作所需的信息。
不幸的是,这需要存储比我最初预期的更多的信息。对于一条线,我们还必须考虑用于最初绘制它的Color
、Stroke
和RenderingHints
等因素。这使得我的“简单小命令”变得更加笨重,需要更多样板代码(每个都将成为可序列化的bean1)。
出于内存保护的原因(大多数情况下),我希望在命令的规范上“作弊”。也许可以在每100次更新时备份整个绘图区域,但否则不存储任何已更改的图像部分,并仅为每个新绘制操作重建最后(最多)100个命令。但是,要确保在每个部分绘制之前Graphics
对象的状态正确是有问题的-这部分可能需要一条线,但是RenderingHints
在4个命令之前发生了改变,而Color
在98个命令之前发生了改变,而Stroke
在最后227个命令中保持不变。
我应该:
- 寻找新的模式吗? - 尝试通过调整模式来实现我的特殊需求吗? - 把所有这些都扔进垃圾桶里,因为这是过早的优化,并用最简单(也是最消耗内存)的方式编写符合定义的命令模式的代码?
更新
1. “每个都将是可序列化的bean” 经过第二次考虑,不是这样的。我进行了一些检查,发现一个Graphics2D(它整洁地封装了许多绘图时使用的参数)不可序列化。此外,BasicStroke是可序列化的,但未存储笔画的粗细。我可以创建许多属性的可序列化版本,但这似乎会导致更多的代码,因此我将放弃该规范。我只会尝试在运行时存储对BufferedImage的引用。