【问题标题】:How is java.io.Serializable the Memento pattern?java.io.Serializable 是如何实现 Memento 模式的?
【发布时间】:2011-09-30 09:15:12
【问题描述】:

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

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

【问题讨论】:

标签: java design-patterns serializable memento


【解决方案1】:

Wikipedia article on the Memento pattern 没有提到任何关于封装的内容,事实上,那里给出的示例准确地捕获了 Memento 中私有变量中保存的状态。

封装(“一种语言机制,用于限制对某些对象组件的访问”)是指您必须如何编写代码才能更改对象的内部状态。

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

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

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

【讨论】:

  • 对此+1。封装意味着一个类不允许程序中的其他实体直接访问和修改数据/方法。如果封装意味着完全而不是部分不透明,那么将其私有数据成员保存到文本文件的类会是什么?违反封装原则?事实上,这意味着所有面向对象的数据库管理系统都会违反封装。这会让 O-O 大师们非常恼火:-)
【解决方案2】:

From Wikipedia's encapsulation article: 在编程语言中,封装用于指代两个相关但不同的概念之一,有时也指它们的组合:

  • 一种用于限制对某些对象组件的访问的语言机制。
  • 一种语言结构,有助于将数据与操作该数据的方法(或其他函数)捆绑在一起。

From the opaque object article: 内容是不透明的,通常在接收者将 cookie (或在我们的原因中,对象) 数据传回发送者或稍后可能的另一个程序之前不会被解释。

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

【讨论】:

    【解决方案3】:

    我的理解是 Memento 模式没有指定有关 memento/token 本身的格式/不透明度/安全性的任何内容。备忘录的格式(人类可读、完全加密或介于两者之间的任何格式)与模式本身无关。

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

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 2010-10-15
      • 1970-01-01
      • 2018-01-02
      • 2020-03-06
      • 2012-07-05
      • 1970-01-01
      • 2014-08-05
      • 2017-04-13
      相关资源
      最近更新 更多