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