Why this matters
The naive approach to undo is to expose all of an object's fields so that external code can save and restore them. But this breaks encapsulation — every client now depends on the object's internals. Add a field, and the undo system silently breaks. The Memento pattern solves this elegantly: the object itself creates a snapshot (Memento) that is opaque to the outside. External code stores and returns the snapshot, but never inspects it.
El enfoque ingenuo para deshacer es exponer todos los campos de un objeto para que el código externo pueda guardarlos y restaurarlos. Pero esto rompe la encapsulación — cada cliente ahora depende de los internos del objeto. Añade un campo y el sistema de deshacer falla silenciosamente. El patrón Memento resuelve esto elegantemente: el propio objeto crea una instantánea (Memento) que es opaca para el exterior. El código externo almacena y devuelve la instantánea, pero nunca la inspecciona.
Memento vs Command for undoMemento vs Command para deshacer
Both patterns enable undo, but differently. Command stores the inverse operation — to undo "type Hello" it deletes "Hello". Memento stores a full snapshot — restoring is always a simple replacement. Command is more memory-efficient for small changes; Memento is simpler to implement correctly when state is complex or there's no clean inverse. Use Command when the inverse is obvious; Memento when it isn't.
Ambos patrones habilitan deshacer, pero de forma diferente. Command almacena la operación inversa — para deshacer "escribir Hola" elimina "Hola". Memento almacena una instantánea completa — restaurar es siempre un reemplazo simple. Command es más eficiente en memoria para cambios pequeños; Memento es más simple de implementar correctamente cuando el estado es complejo o no hay una inversa limpia. Usa Command cuando la inversa es obvia; Memento cuando no lo es.
💡 Key takeaway
Memento's key insight: the originator (Editor) creates its own snapshot — no external code needs to read its private state to implement undo.
La clave de Memento: el originador (Editor) crea su propia instantánea — ningún código externo necesita leer su estado privado para implementar deshacer.