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