java redo_java – paint应用程序中undo / redo的命令模式

我想在一个小的

paint application中实现undo / redo.看起来

Command Pattern非常适合使用,但我不确定如何最好地实现它.

据我了解的模式,有必要在每个命令中包含:

>用于重做的绘制操作的详细信息(例如,行 – >开始和结束点,自由格式行 – > GeneralPath)

>更改撤消之前组件的状态.在这种情况下,这将是受命令影响的区域的小快照图像.

我的理解是,每个命令都需要是“原子的”或自包含的,并具有撤消/重做该操作所需的所有信息.

不幸的是,这需要存储比我最初预期更多的信息.对于一行,我们还必须考虑最初用于绘制它的Color,Stroke和RenderingHints之类的东西.这将我的“简单的小命令”变成了一些东西……在内存中体积更大,并且有更多的样板代码可以生成(每个都是可序列化的bean1).

出于记忆保护的原因(大多数情况下),我想要“欺骗”命令的规范.也许每100次更新都会备份整个绘图区域,但是不存储已更改图像的任何部分,只需为每次新的绘制操作重建最后(最多)100个命令.但是在绘制每个零件之前确保Graphics对象的状态是正确的似乎是有问题的 – 这部分可能需要一条线,但RenderingHints在4个命令之前被更改,Color在之前改变了98个命令,而Stroke仍然是最后227个命令也一样.

追求更高效的内存命令似乎将模式从“原子”方面抛到了窗外.这反过来导致难以确定可能影响渲染的最早命令.

我是不是该:

>寻找新的模式?

>尝试通过调整模式来实现我的特殊需求?

>将所有这些放在垃圾箱中作为过早优化,并以最简单(并且最耗费内存消耗)的方式对其进行编码,以便遵循定义的命令模式?

更新

>“每个都将是一个可序列化的豆”第二个想法,没有.我做了圆顶检查,发现Graphics2D(整齐地封装了绘制时使用的许多参数)不可序列化.此外,BasicStroke是可序列化的,但不存储笔划的粗细.我可以创建许多属性的可序列化版本,但它似乎会产生更多的代码,所以我将放弃该规范.同样.我将只尝试在运行时存储对BufferedImage的引用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值