模式说明

以游戏中的存档和恢复存档为例,在游戏过程中需要保存当前游戏状态(包括各种游戏角色属性)作为存档,在之后的某个时刻能够恢复这个存档。文档中的撤销操作也有类似的需求。此类场景可以用备忘录模式(也叫快照模式)实现。该模式涉及三个角色,发起人类,备忘录类和备忘录管理者类。发起人类管理系统当前状态,并有一个保存为备忘的存档方法,一个恢复为指定备忘版本的恢复存档方法。备忘录类只管理该备忘的状态信息,而备忘录管理者只管理备忘录实例。符合单一职责原则。

本示例客户端中展示备忘录使用过程。声明一个发起者,该发起者设置系统状态后存档。然后创建当前系统存档(备忘录),并让一个备忘录管理者持有。接着该发起者修改系统状态,最后调用存档恢复方法恢复到修改前状态。

结构

发起人类
持有所有状态信息,并有对应的getter/setter方法。维护一个存档方法createMemento,返回记录当前系统状态信息的Memento。另有一个恢复指定存档的方法restoreMomento(Memento m),通过参数执行要恢复的Memento
备忘录类
管理一个备忘中的系统状态信息。本例中只设置了一个状态信息String state,通过构造器初始化该state,并有该stategetter/setter
备忘录管理者类
持有一个备忘录实例,并有该备忘录实例的getter/setter

代码演示

  1. package com.yukiyama.pattern.behavior;
  2. /**
  3. * 备忘录模式
  4. */
  5. public class MementoDemo {
  6. public static void main(String[] args) {
  7. // 声明一个发起者实例
  8. Originator ori = new Originator();
  9. // 设置状态为“Alive”
  10. ori.setState("Alive");
  11. // 初始时状态为"Alive",输出"当前状态为:Alive"
  12. ori.display();
  13. // 声明一个备忘录管理者并让其持有当前memento
  14. MementoManager manager = new MementoManager();
  15. manager.setMemento(ori.CreateMemento());
  16. // 修改ori中的状态为"Dead"
  17. ori.setState("Dead");
  18. // 此时ori中的状态为"Dead",输出"当前状态为:Dead"
  19. ori.display();
  20. // 通过管理者持有的备忘录恢复存档
  21. ori.restoreMemento(manager.getMemento());
  22. // 恢复后状态为存档时的"Alive",输出"当前状态为:Alive"
  23. ori.display();
  24. }
  25. }
  26. /**
  27. * 发起人类
  28. * 持有所有状态信息,并有对应的getter/setter方法。维护一个存档方法
  29. * createMemento,返回记录当前系统状态信息的Memento。另有一个恢复指定
  30. * 存档的方法restoreMomento(Memento m),通过参数执行要恢复的Memento。
  31. */
  32. class Originator{
  33. private String state;
  34. public String getState() {
  35. return state;
  36. }
  37. public void setState(String state) {
  38. this.state = state;
  39. }
  40. public Memento CreateMemento() {
  41. return new Memento(state);
  42. }
  43. public void restoreMemento(Memento memento) {
  44. this.state = memento.getState();
  45. }
  46. public void display() {
  47. System.out.println("当前状态为:" + state);
  48. }
  49. }
  50. /**
  51. * 备忘录类
  52. * 管理一个备忘中的系统状态信息。本例中只设置了一个状态信息String state,
  53. * 通过构造器初始化该state,并有该state的getter/setter。
  54. */
  55. class Memento{
  56. private String state;
  57. public Memento(String state) {
  58. this.state = state;
  59. }
  60. public String getState() {
  61. return state;
  62. }
  63. public void setState(String state) {
  64. this.state = state;
  65. }
  66. }
  67. /**
  68. * 备忘录管理者类
  69. * 持有一个备忘录实例,并有该备忘录实例的getter/setter。
  70. */
  71. class MementoManager{
  72. private Memento memento;
  73. public Memento getMemento() {
  74. return memento;
  75. }
  76. public void setMemento(Memento memento) {
  77. this.memento = memento;
  78. }
  79. }