Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memento模式的java.io.Serializable是如何实现的?_Java_Design Patterns_Serializable_Memento - Fatal编程技术网

Memento模式的java.io.Serializable是如何实现的?

Memento模式的java.io.Serializable是如何实现的?,java,design-patterns,serializable,memento,Java,Design Patterns,Serializable,Memento,正如我们所知,memento模式在不违反封装的情况下捕获并外部化对象的内部状态,并且可以在不知道原始状态的情况下稍后回收 我的问题是,java.io.Serializable是如何在这种模式下出现的,因为当我们对任何私有变量进行序列化并将对象状态写入文件时,私有变量的值是向世界开放的,而封装在这里似乎失败了。任何关于封装的东西,事实上,这里给出的示例准确地捕获了Memento中私有变量中的状态 封装(“限制对某些对象组件的访问的语言机制”)指的是如何编写代码以更改对象的内部状态 然而,对象的内部

正如我们所知,memento模式在不违反封装的情况下捕获并外部化对象的内部状态,并且可以在不知道原始状态的情况下稍后回收

我的问题是,
java.io.Serializable
是如何在这种模式下出现的,因为当我们对任何私有变量进行序列化并将对象状态写入文件时,私有变量的值是向世界开放的,而封装在这里似乎失败了。

任何关于封装的东西,事实上,这里给出的示例准确地捕获了Memento中私有变量中的状态

封装(“限制对某些对象组件的访问的语言机制”)指的是如何编写代码以更改对象的内部状态

然而,对象的内部状态可以由外部输入确定,例如字符串的内容取决于从中读取对象的文件或从网络接收到的数据。复选框的状态取决于用户是否选中了复选框,而类中的相应字段可能具有私有访问权限,并且对于其他类,该状态可能是只读的

通过将字段置于私有访问下来保护字段,旨在帮助开发人员将对象的状态保持在一致状态,即避免将字段设置为与该类之外的代码不一致的状态(例如,如果字段
a
的值取决于字段
B

它与“隐私”无关,因为这些数据被视为机密。当然,可以编写另一个类,然后读取序列化的私有字段并使它们在另一个类中公开,或者您甚至可以编辑序列化文件,但我不确定从中可以获得什么。

在编程语言中,封装用于指代两个相关但不同的概念之一,有时,这两者结合起来:

  • 一种语言机制,用于限制对某些对象组件的访问
  • 一种便于将数据与操作该数据的方法(或其他函数)捆绑在一起的语言结构
这些内容是不透明的,通常在接收者将cookie(或者在我们的原因中,对象)数据传递回发送者或者稍后的另一个程序之前不会被解释


封装没有被破坏。memento模式阻止管理员对象更改memento对象,以便发起者可以将其用于回滚或其他实用程序。

我的理解是memento模式没有指定memento/token本身的格式/不透明度/安全性。纪念品的格式(人类可读、完全加密或介于两者之间)与图案本身无关


我认为序列化(XML或二进制)是Memento实现的一个很好的例子。它公开对象内部的事实可能意味着它不是项目的最佳实现。但是,它仍然是该模式的有效实现。:)

没有出现任何
封装
@Andre,请参阅下面的链接。还有一个链接供您参考。GoF的书明确提到了封装。它接着解释说,memento对所有人都应该是“不透明”的,但对原始类除外。@advs89,这是否意味着它不应该用于序列化,如果它是由不同的类(例如,一个XML框架)序列化的话?+1。封装意味着类不允许程序中的其他实体直接访问和修改数据/方法。如果封装意味着完全不透明,而不是部分不透明,那么将其私有数据成员保存到文本文件的类将是什么?违反封装原则的人?事实上,这意味着所有面向对象的数据库管理系统都将违反封装。这会让O-O大师非常恼火:——)