定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
UML
优点
- 将被存储的状态放在外面,不要和关键对象混在一起,可以帮助维护内聚;
- 保持关键对象的数据封装;
- 提供了容易实现的恢复能力。
缺点
- 储存和恢复状态的过程可能相当耗时。
应用场景
- 备忘录模式用于存储状态,在java中可以使用序列化;
- 如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。
示例
使用备忘录模式备份和还原一个状态。
Java
1 public class Main 2 { 3 public static void main(String[] args) 4 { 5 Originator originator = new Originator(); 6 originator.setState("状态1"); 7 System.out.println("初始状态:" + originator.getState()); 8 Caretaker caretaker = new Caretaker(); 9 caretaker.setMemento(originator.createMemento()); 10 originator.setState("状态2"); 11 System.out.println("改变后状态:" + originator.getState()); 12 originator.restoreMemento(caretaker.getMemento()); 13 System.out.println("恢复后状态:" + originator.getState()); 14 } 15 16 /** 17 * 发起人类,该类的内部状态需要进行备份,并提供createMemento和restoreMemento两个方法来进行备份和恢复 18 */ 19 public static class Originator 20 { 21 private String state = ""; 22 23 public String getState() 24 { 25 return state; 26 } 27 28 public void setState(String state) 29 { 30 this.state = state; 31 } 32 33 public Memento createMemento() 34 { 35 return new Memento(this.state); 36 } 37 38 public void restoreMemento(Memento memento) 39 { 40 this.setState(memento.getState()); 41 } 42 } 43 44 /** 45 * 备忘录类,该类仅用来记录发起人的内部状态 46 * 如果需要记录多份状态可以修改该类来进行支持 47 */ 48 public static class Memento 49 { 50 private String state = ""; 51 52 public Memento(String state) 53 { 54 this.state = state; 55 } 56 57 public String getState() 58 { 59 return state; 60 } 61 62 public void setState(String state) 63 { 64 this.state = state; 65 } 66 } 67 68 /** 69 * 管理类,该类用来管理指定的发起人创建的备忘录类 70 * 如果需要管理多个备忘录可以修改该类来进行支持 71 */ 72 public static class Caretaker 73 { 74 private Memento memento; 75 76 public Memento getMemento() 77 { 78 return memento; 79 } 80 81 public void setMemento(Memento memento) 82 { 83 this.memento = memento; 84 } 85 } 86 }