设计模式(19/23) - 备忘录模式

107 阅读3分钟

备忘录模式

1 概述

  • 备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装的前提下捕获和恢复对象的内部状态。备忘录模式通过存储对象在某个时刻的状态,使得对象可以在以后恢复到该状态。
  • 这种模式通过引入备忘录对象来存储状态,从而使得对象的状态恢复变得更加容易和灵活。

2 优缺点及应用场景

2.1 优点

  • 1)状态恢复:可以方便地恢复对象到之前的某个状态。
  • 2)封装性:保持了对象的封装性,外部对象不需要了解对象的内部状态。
  • 3)简化了撤销操作:可以通过备忘录模式实现撤销功能。

2.2 缺点

  • 1)增加内存开销:存储对象的状态会消耗较多的内存,特别是在对象状态较多或较复杂时。
  • 2)实现复杂:需要管理好备忘录对象的创建和恢复操作,增加了系统的复杂性。

2.3 应用场景

  • 1)数据库事务管理:通过事务日志保存状态,实现回滚。
  • 2)需要保存和恢复对象状态:需要在某个时刻保存对象的状态,并在以后恢复的场景。
  • 3)实现撤销功能:可以通过备忘录模式实现系统的撤销功能。
  • 4)需要对外隐藏对象的内部状态:需要保持对象的封装性,对外隐藏对象的内部状态的场景。

3 结构

  • 1)发起人(Originator):创建一个备忘录,记录当前时刻的内部状态,并可使用备忘录恢复内部状态。
  • 2)备忘录(Memento):存储发起人的内部状态,并可以防止除发起人以外的其他对象访问备忘录。
  • 3)负责人(Caretaker):负责保存备忘录,不能对备忘录的内容进行操作或检查。

4 实现

4.1 UML 类图

备忘录模式.jpg

4.2 代码示例

// 创建 Memento 类
class Memento {
  private String state;

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

  public String getState() {
    return state;
  }
}

// 创建 Originator 类
class Originator {
  private String state;

  public void setState(String state) {
    this.state = state;
  }

  public String getState() {
    return state;
  }

  public Memento saveStateToMemento() {
    return new Memento(state);
  }

  public void getStateFromMemento(Memento Memento) {
    state = Memento.getState();
  }
}

// 创建 CareTaker 类
class CareTaker {
  private List<Memento> mementoList = new ArrayList<Memento>();

  public void add(Memento state) {
    mementoList.add(state);
  }

  public Memento get(int index) {
    return mementoList.get(index);
  }
}

// 使用示例
public class MementoPatternDemo {
  public static void main(String[] args) {
    // 使用 CareTaker 和 Originator 对象
    Originator originator = new Originator();
    CareTaker careTaker = new CareTaker();
    originator.setState("State #1");
    originator.setState("State #2");
    careTaker.add(originator.saveStateToMemento());
    originator.setState("State #3");
    careTaker.add(originator.saveStateToMemento());
    originator.setState("State #4");

    System.out.println("Current State: " + originator.getState());
    originator.getStateFromMemento(careTaker.get(0));
    System.out.println("First saved State: " + originator.getState());
    originator.getStateFromMemento(careTaker.get(1));
    System.out.println("Second saved State: " + originator.getState());
  }
}
  • 执行程序,输出结果:
Current State: State #4
First saved State: State #2
Second saved State: State #3

5 总结

  • 备忘录模式通过在不破坏封装的前提下捕获和恢复对象的内部状态,实现了状态的恢复和撤销功能。备忘录模式适用于需要保存和恢复对象状态、实现撤销功能以及需要对外隐藏对象内部状态的场景。尽管备忘录模式增加了内存开销和系统复杂性,但它在状态恢复和保持对象封装性方面具有显著优势。在实际应用中,需要根据具体需求合理使用备忘录模式,以实现灵活可扩展的系统设计。