【发布时间】:2017-08-30 03:58:59
【问题描述】:
显然,存储更改历史数组需要大量内存……这就是我的应用程序的工作方式,但似乎有一种更聪明的方法可以做到这一点。
ArrayList<Photo> photoHistory = new ArrayList<>();
photoHistory.add(originalPhoto);
photoHistory.add(change1);
photoHistory.add(change2);
// bad implementation - lots of memory
也许只存储原始视图模型和当前视图模型并记录使用的方法/过滤器?那么当用户点击“撤消”时,它会采用所做的更改总数并再次将所有更改减去一?这似乎也非常低效。
我想我只是在寻找有关如何实现软件应用程序的一般“撤消”功能的建议。
【问题讨论】:
-
计算更改前后的增量,即应用到新版本以逆转更改的增量。历史就是那些三角洲。对于全滤镜,这可能是全图,但对于像红眼滤镜这样的东西,它只是眼睛,即小得多。
-
好吧,如果您只想拥有一个通用的撤消功能,@AndyTurner 链接的命令模式是一个很好的模式。然而,在图形应用场景中让它变得相当复杂的是 undo 方法本身(需要将其添加到每个命令中)。在命令中实现撤消可能并不那么容易。正如您所提到的 - 您可以保留已执行命令的列表,并在撤消最后一个命令时重新应用以前的命令。不过,这可能效率很低。所以,总结一下——在一般情况下,命令模式是可以的,但可能不是图形编辑器中的最佳选择。