在一个绘图应用程序中,我使用Memento pattern来实现多级撤销/重做。我面临的一个问题是,如果图形包含一个或多个图像对象(如我的图形对象可以嵌入base64编码的图像对象,就像Visual Studio的resx文件一样),则记忆(状态对象)将变得太大, ,由于绘图应用程序中常见的频繁鼠标操作,这将使撤销/重做堆栈很快攀升至几兆字节。为了解决这个问题,我在其中引入了gzip压缩,以便现在我将一个压缩版的纪念品保存到堆栈中。这导致整个堆栈大小减少了大约90%。实现撤销/重做
现在,这导致了另一个问题。压缩/解压缩纪念品所花费的时间在对象定位/调整大小时引入了相当大的麻烦。
解决此问题的一种方法是使用Command pattern,但我不愿走这条路,因为它会在应用程序的许多部分引入大量工作。你看到了什么其他替代品?
您只能压缩比X更早的纪念品,或者随着堆栈增长,最后的Y纪念品会一直解压并压缩它们。这样,您可以快速撤消最后的Y个命令,但仍可压缩大部分历史记录以节省空间。 – poke
@Poke这是一个非常有趣的想法,但是如何处理栈中存在超过Y个记忆的情况?每一次操作都会再次需要压缩一个新的对象。 –
@poke:正如Samy所指出的那样,这只是在Y纪念品之后才会出现在我现在所在的同一个地方。 – dotNET