备忘录模式

1. 什么是备忘录模式

Memento 模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。

2. 备忘录模式的应用场景

如果一个对象需要保存状态并可通过 undo 或 rollback 等操作恢复到以前的状态时,可以使用 Memento 模式。

  1. 一个类需要保存它的对象的状态(相当于 Originator 角色)。
  2. 设计一个类,该类只是用来保存上述对象的状态(相当于 Memento 角色)。
  3. 需要的时候,Caretaker 角色要求 Originator 返回一个 Memento 并加以保存。
  4. undo 或 rollback 操作时,通过 Caretaker 保存的 Memento 恢复 Originator 对象的状态。

3. 备忘录模式的结构

22_备忘录模式 - 图1

4. 备忘录模式的角色和职责

  • Originator(原生者):需要被保存状态以便恢复的那个对象
  • Memento(备忘录):该对象由 Originator 创建,主要用来保存 Originator 的内部状态。
  • Caretaker(管理者):负责在适当的时间保存恢复 Originator 对象的状态

5. 代码演示

5.1. 手动备份

  1. public class Person {
  2. private String name;
  3. private String sex;
  4. private int age;
  5. public Person() {
  6. }
  7. public Person(String name, String sex, int age) {
  8. this.name = name;
  9. this.sex = sex;
  10. this.age = age;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getSex() {
  19. return sex;
  20. }
  21. public void setSex(String sex) {
  22. this.sex = sex;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. @Override
  31. public String toString() {
  32. return "Person{" +
  33. "name='" + name + '\'' +
  34. ", sex='" + sex + '\'' +
  35. ", age=" + age +
  36. '}';
  37. }
  38. }
  1. Person person = new Person("lifengxing", "男", 30);
  2. Person backup = new Person();
  3. backup.setName(person.getName());
  4. backup.setSex(person.getSex());
  5. backup.setAge(person.getAge());
  6. System.out.println(person);
  7. person.setAge(20);
  8. System.out.println(person);
  9. person.setName(backup.getName());
  10. person.setSex(backup.getSex());
  11. person.setAge(backup.getAge());
  12. System.out.println(person);
  1. Person{name='lifengxing', sex='男', age=30}
  2. Person{name='lifengxing', sex='男', age=20}
  3. Person{name='lifengxing', sex='男', age=30}

5.2. 使用备忘录

  1. public class Person {
  2. // ...
  3. public Memento createMemento() {
  4. return new Memento(name, sex, age);
  5. }
  6. public void setMemento(Memento memento) {
  7. this.setName(memento.getName());
  8. this.setSex(memento.getSex());
  9. this.setAge(memento.getAge());
  10. }
  11. }
  1. public class Memento {
  2. private String name;
  3. private String sex;
  4. private int age;
  5. public Memento(String name, String sex, int age) {
  6. this.name = name;
  7. this.sex = sex;
  8. this.age = age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public String getSex() {
  17. return sex;
  18. }
  19. public void setSex(String sex) {
  20. this.sex = sex;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28. }
  1. public class Caretaker {
  2. private Memento memento;
  3. public Memento getMemento() {
  4. return memento;
  5. }
  6. public void setMemento(Memento memento) {
  7. this.memento = memento;
  8. }
  9. }
  1. Person person = new Person("lifengxing", "男", 30);
  2. Memento memento = person.createMemento();
  3. System.out.println(person);
  4. person.setAge(20);
  5. System.out.println(person);
  6. person.setMemento(memento);
  7. System.out.println(person);
  1. Person person = new Person("lifengxing", "男", 30);
  2. Caretaker caretaker = new Caretaker();
  3. caretaker.setMemento(person.createMemento());
  4. System.out.println(person);
  5. person.setAge(20);
  6. System.out.println(person);
  7. person.setMemento(caretaker.getMemento());
  8. System.out.println(person);