21. 备忘录模式(Memento)

问题:需要保存和恢复对象之前的状态(如撤销操作、存档)。

核心:在不破坏封装的前提下,捕获对象的内部状态并外部存储。

class EditorMemento {
  constructor(content) { this.content = content; }
}

class Editor {
  #content = '';
  type(text) { this.#content += text; }
  getContent() { return this.#content; }
  save() { return new EditorMemento(this.#content); }
  restore(memento) { this.#content = memento.content; }
}

const editor = new Editor();
editor.type('你好');
editor.type('世界');
console.log(editor.getContent()); // 你好世界

const saved = editor.save();
editor.type('!');
console.log(editor.getContent()); // 你好世界!

editor.restore(saved);
console.log(editor.getContent()); // 你好世界
package memento

import "fmt"

type Memento struct {
  content string
}

func (m Memento) Content() string { return m.content }

type Editor struct {
  content string
}

func (e *Editor) Type(text string) { e.content += text }

func (e *Editor) GetContent() string { return e.content }

func (e *Editor) Save() Memento {
  return Memento{content: e.content}
}

func (e *Editor) Restore(m Memento) {
  e.content = m.Content()
}

// 使用
// editor := &Editor{}
// editor.Type("你好")
// editor.Type("世界")
// saved := editor.Save()
// editor.Type("!")
// editor.Restore(saved)
// fmt.Println(editor.GetContent()) // 你好世界