我需要在Java应用程序中的几个操作中保存状态历史记录,稍后我可以重新加载以便在某个操作中恢复状态.换句话说,我有一个屏幕,它有一个与之关联的状态,我需要存储它以及历史记录中的任何更改,以便我可以随时恢复屏幕状态.这有点像'撤消',但不完全是因为两个状态之间的差异可能非常大,并且没有明确定义的动作可以改变状态.
让我用一个例子来解释一下:一个非常基本的屏幕状态可能只包含一个Map.在状态A中,该Map包含对"Object1"的引用,其中键"Key1"和"Object2"具有键"Key2".在状态B中,Map仍包含对"Object1"的引用,但"Object2"已被修改并且已添加"Object3".我现在需要能够返回到状态A,这将涉及"丢弃"Object3并将Object2恢复到其先前的状态.我无法定义任何自定义的"撤消操作",因为我不知道对Object2进行了哪些更改,甚至不知道Object2的类型是什么.此外,因为状态A和B中的Object2的引用保持相同,所以这些更改反映在状态A中,因此Object2与它不同.
我意识到最好的解决方案是实现克隆方法,但是因为我需要支持所有类型的对象(包括基元和标准集合),所以这是不可行的.我想过使用serializable,我会在状态转换发生后立即序列化Map,然后在需要时再反序列化它,但这似乎是一个非常难看的解决方案.
有没有人有其他想法?谢谢你,Ristretto
Chr*_*nch 13
您是否尝试过观看Memento设计模式?它似乎特别适合您的问题.来自维基百科:
memento模式是一种软件设计模式,它提供将对象恢复到其先前状态的能力(通过回滚撤消).
同一页面也有一个带有Java实现的部分,因为你提到它是用Java实现的.
我们通过序列化做类似的事情。
我们将归档数据以序列化形式存储到文件系统中。我们需要恢复的对象图部分和主对象一样被序列化。
确保您对对象进行版本控制,并确保您的差异可以应对丢失/新字段。
我们选择存储到文件系统,因为它为我们提供(有效)无限的容量。速度对我们来说不是问题,但文件系统方法出奇地快,大多数人都没有注意到额外的 50-100ms!
| 归档时间: |
|
| 查看次数: |
4713 次 |
| 最近记录: |