备忘录模式
1. 什么是备忘录模式
Memento 模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
2. 备忘录模式的应用场景
如果一个对象需要保存状态并可通过 undo 或 rollback 等操作恢复到以前的状态时,可以使用 Memento 模式。
- 一个类需要保存它的对象的状态(相当于 Originator 角色)。
- 设计一个类,该类只是用来保存上述对象的状态(相当于 Memento 角色)。
- 需要的时候,Caretaker 角色要求 Originator 返回一个 Memento 并加以保存。
- undo 或 rollback 操作时,通过 Caretaker 保存的 Memento 恢复 Originator 对象的状态。
3. 备忘录模式的结构

4. 备忘录模式的角色和职责
- Originator(原生者):需要被保存状态以便恢复的那个对象
- Memento(备忘录):该对象由 Originator 创建,主要用来保存 Originator 的内部状态。
- Caretaker(管理者):负责在适当的时间保存恢复 Originator 对象的状态
5. 代码演示
5.1. 手动备份
public class Person {private String name;private String sex;private int age;public Person() {}public Person(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", age=" + age +'}';}}
Person person = new Person("lifengxing", "男", 30);Person backup = new Person();backup.setName(person.getName());backup.setSex(person.getSex());backup.setAge(person.getAge());System.out.println(person);person.setAge(20);System.out.println(person);person.setName(backup.getName());person.setSex(backup.getSex());person.setAge(backup.getAge());System.out.println(person);
Person{name='lifengxing', sex='男', age=30}Person{name='lifengxing', sex='男', age=20}Person{name='lifengxing', sex='男', age=30}
5.2. 使用备忘录
public class Person {// ...public Memento createMemento() {return new Memento(name, sex, age);}public void setMemento(Memento memento) {this.setName(memento.getName());this.setSex(memento.getSex());this.setAge(memento.getAge());}}
public class Memento {private String name;private String sex;private int age;public Memento(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}
Person person = new Person("lifengxing", "男", 30);Memento memento = person.createMemento();System.out.println(person);person.setAge(20);System.out.println(person);person.setMemento(memento);System.out.println(person);
Person person = new Person("lifengxing", "男", 30);Caretaker caretaker = new Caretaker();caretaker.setMemento(person.createMemento());System.out.println(person);person.setAge(20);System.out.println(person);person.setMemento(caretaker.getMemento());System.out.println(person);
