返回

备忘录模式:在不破坏封装性的情况下保存和恢复对象状态

后端

备忘录模式是一种设计模式,它允许您在不破坏对象的封装性的情况下保存和恢复其状态。这在需要在不同时间点存储和恢复对象状态的情况下非常有用,例如在撤消/重做操作中。

备忘录模式的工作原理

备忘录模式包含以下关键角色:

  • 发起者 (Originator): 需要保存状态的对象。
  • 备忘录 (Memento): 存储发起者状态的一个对象。
  • 看护者 (Caretaker): 负责管理备忘录并提供访问权限。

当您想要保存发起者的状态时,您可以调用 createMemento() 方法来创建一个新的备忘录对象。此备忘录对象将存储发起者的当前状态。然后,您可以将此备忘录对象传递给看护者以进行安全存储。

当您需要恢复发起者的状态时,您可以调用 restoreState() 方法并传递备忘录对象。发起者将从备忘录中检索其状态并恢复到该状态。

备忘录模式的优点

使用备忘录模式提供了以下优点:

  • 封装性: 发起者的状态被保存在备忘录中,从而不会破坏其封装性。
  • 灵活性: 您可以随时创建多个备忘录来存储发起者的不同状态。
  • 撤消/重做操作: 备忘录模式非常适合在撤消/重做操作中使用,因为它允许您轻松地在不同的状态之间切换。
  • 时间旅行: 备忘录模式可用于实现时间旅行功能,允许您将对象恢复到其过去的状态。

备忘录模式的示例

让我们考虑一个简单的例子,其中我们有一个 Document 类,它表示一个可以保存和编辑的文档。我们可以使用备忘录模式来存储文档的当前内容,以便以后我们可以撤消任何更改。

以下是使用备忘录模式的代码示例:

class Document {
  private String content;

  public Document(String content) {
    this.content = content;
  }

  public void setContent(String content) {
    this.content = content;
  }

  public String getContent() {
    return content;
  }

  public Memento createMemento() {
    return new Memento(content);
  }

  public void restoreState(Memento memento) {
    content = memento.getState();
  }
}

class Memento {
  private String state;

  public Memento(String state) {
    this.state = state;
  }

  public String getState() {
    return state;
  }
}

class Caretaker {
  private Memento memento;

  public void setMemento(Memento memento) {
    this.memento = memento;
  }

  public Memento getMemento() {
    return memento;
  }
}

在上面的示例中,Document 类是发起者,Memento 类是备忘录,Caretaker 类是看护者。当文档的内容发生更改时,我们可以创建一个新的备忘录并将其传递给看护者。当需要撤消更改时,我们可以从看护者那里获取备忘录并使用它来恢复文档的状态。