2011-07-07 23 views
8

Como sabemos, el patrón de memento es sin violar la encapsulación, capturar y externalizar el estado interno de un objeto y puede recuperarse más tarde sin conocimiento del estado original.¿Cómo se java.io.Serializable el patrón Memento?

Mi pregunta viene aquí cómo java.io.Serializable se encuentra bajo este patrón, porque cuando estamos serializar cualquier variable privada y escribir el estado del objeto a un archivo al mismo tiempo el valor de la varible privada está abierta al mundo y la encapsulación parece estar fallando aquí.

+0

el [artículo de Wikipedia sobre el patrón Memento] (http://en.wikipedia.org/wiki/Memento_pattern) no tiene ninguna ocurrencia de 'encapsulación'. –

+0

@Andre, consulte el siguiente enlace. http://www.javacamp.org/designPattern/ – BOSS

+0

Un enlace más para su referencia. http://sourcemaking.com/design_patterns/memento – BOSS

Respuesta

4

El Wikipedia article on the Memento pattern no menciona nada acerca de la encapsulación, de hecho, el ejemplo dado allí captura exactamente el estado mantenido en una variable privada en un Memento.

encapsulación ('Un lenguaje mecanismo para restringir el acceso a algunos de los componentes del objeto') se refiere a la forma en que tiene que escribir código con el fin de cambiar el estado interno de un objeto.

Sin embargo, el estado interno de un objeto podría haber sido determinado por una entrada externa, ya que el contenido de una cadena depende del archivo desde el que se leyó o de la información que se recibió de la red. El estado de una casilla de verificación depende de si el usuario lo ha marcado o no, mientras que el campo correspondiente de la clase podría tener acceso privado y el estado podría ser de solo lectura para otras clases.

Proteger campos poniéndolos bajo acceso privado sirve para ayudar al desarrollador a mantener los estados de los objetos en un estado constante, es decir, evitar que los campos estén configurados en un estado inconsistente fuera de esa clase (por ejemplo, si el valor de el campo A depende del valor del campo B).

No tiene nada que ver con "privacidad" en el sentido de que se considera que esta información es secreto. Por supuesto, uno podría escribir otra clase que luego lea los campos privados serializados y los ponga a disposición del público en una clase diferente o incluso podría editar el archivo serializado, pero no estoy seguro de qué ganaría con esto.

+1

+1 a esto. La encapsulación significa que una clase no permite que otras entidades en el programa accedan y modifiquen los datos/métodos directamente. Si la encapsulación significaba opacidad total y no parcial, ¿qué significaría una clase que guarde sus miembros de datos privados en un archivo de texto? ¿Un violador de los principios de encapsulación? De hecho, esto significa que todos los sistemas de gestión de bases de datos orientadas a objetos violarían la encapsulación. Y eso molestaría demasiado a los O-O gurús :-) – 2rs2ts

0

From Wikipedia's encapsulation article: En una encapsulación lenguaje de programación se utiliza para referirse a uno de dos nociones relacionadas pero distintas, y algunas veces a la combinación de los mismos:

  • Un mecanismo de idioma para restringir el acceso a algunos de los componentes del objeto.
  • Un constructo de lenguaje que facilita la agrupación de datos con los métodos (u otras funciones) que operan en esos datos.

From the opaque object article: El contenido es opaco y no suele ser interpretado hasta que el receptor pasa la cookie (o en nuestra causa, el objeto) datos de vuelta al remitente o tal vez otro programa en un momento posterior.

La encapsulación no está rota. El patrón de recuerdo evita que el objeto cuidador cambie el objeto de recuerdo, de modo que el creador puede tomarlo para deshacer u otras utilidades.

0

Mi comprensión es que el patrón Memento no especifica nada sobre el formato/opacidad/seguridad del memento/token en sí. El formato del recuerdo (legible por el ser humano, completamente encriptado o en cualquier punto intermedio) es irrelevante para el patrón en sí.

Yo diría que la serialización (XML o binario) es un buen ejemplo de implementación de Memento. El hecho de que expone elementos internos del objeto puede significar que no es la mejor implementación para su proyecto. Sin embargo, sigue siendo una implementación válida del patrón. :)

Cuestiones relacionadas