正如我们所知,备忘录模式在不违反封装、捕获和外部化对象的内部状态的情况下,可以在不知道原始状态的情况下稍后回收。
我的问题在这里java.io.Serializable
出现,因为当我们序列化任何私有变量并同时将对象状态写入文件时,私有变量的值对世界开放并且封装似乎在这里失败。
正如我们所知,备忘录模式在不违反封装、捕获和外部化对象的内部状态的情况下,可以在不知道原始状态的情况下稍后回收。
我的问题在这里java.io.Serializable
出现,因为当我们序列化任何私有变量并同时将对象状态写入文件时,私有变量的值对世界开放并且封装似乎在这里失败。
关于 Memento 模式的Wikipedia 文章没有提到任何关于封装的内容,事实上,那里给出的示例准确地捕获了 Memento 中私有变量中保存的状态。
封装(“一种用于限制对某些对象组件的访问的语言机制”)是指您必须如何编写代码才能更改对象的内部状态。
然而,对象的内部状态可能已由外部输入确定,例如字符串的内容取决于从中读取它的文件或从网络接收到的数据。复选框的状态取决于用户是否选中它,而类中的相应字段可能具有私有访问权限,并且该状态对于其他类可能是只读的。
通过将字段置于私有访问下来保护字段旨在帮助开发人员将对象的状态保持在一致的状态,即避免字段被该类之外的代码设置为不一致的状态(例如,如果字段的值A
取决于字段的值B
)。
它与“隐私”无关,因为这些数据被认为是机密的。当然,可以编写另一个类,然后读取序列化的私有字段并使其在不同的类中公开可用,或者您甚至可以编辑序列化文件,但我不确定从中获得什么。
我的理解是纪念品模式没有指定任何关于纪念品/令牌本身的格式/不透明度/安全性的内容。备忘录的格式(人类可读、完全加密或介于两者之间的任何格式)与模式本身无关。
我认为序列化(XML 或二进制)是 Memento 实现的一个很好的例子。它公开对象内部的事实可能意味着它不是您项目的最佳实现。但是,它仍然是该模式的有效实现。:)
来自维基百科的封装文章:在编程语言中,封装用于指代两个相关但不同的概念之一,有时指的是它们的组合:
来自不透明对象文章:内容是不透明的,通常在接收者将 cookie (或在我们的原因中,对象)数据传递回发送者或稍后可能的另一个程序之前不会被解释。
封装没有被破坏。memento 模式防止看守对象更改 memento 对象,以便发起者可以将其用于回滚或其他实用程序。