备忘录模式
定义
Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
代码实现
准备
我们可以用备忘录模式来模拟游戏,游戏开始之后就开始备份游戏开始状态,当游戏失败,游戏结束,我们需要会到游戏开始就需要游戏开始的备份。
备份
备忘录管理员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package org.example.memento;public class Caretaker { private Memento memento ; public Memento getMemento () { return this .memento ; } public void setMemento (Memento memento) { this .memento = memento ; } }
备忘录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package org.example.memento;public class Memento { private String state = "" ; public Memento (String state) { this .state = state ; } public String getState () { return this .state ; } public void setState (String state) { this .state = state ; } }
游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package org.example.memento;public class Game { private String state = "" ; public void changeState () { this .state = "游戏结束" ; } public String getState () { return this .state ; } public void setState (String state) { this .state = state ; } public Memento createMemento () { return new Memento(this .state); } public void restoreMemento (Memento memento) { this .setState(memento.getState()); } }
场景实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class App { public static void main (String[] args) { Game game = new Game(); game.setState("游戏开始" ); System.out.println("=======游戏开始状态=======" ); System.out.println(game.getState()); Caretaker caretaker = new Caretaker(); caretaker.setMemento(game.createMemento()); game.changeState(); System.out.println("=======游戏失败状态=======" ); System.out.println(game.getState()); game.restoreMemento(caretaker.getMemento()); System.out.println("=======游戏恢复状态=======" ); System.out.println(game.getState()); } }
备忘录的扩展
应用实现
需要保存和恢复数据的相关场景。
提供回滚操作,包括文本回退等。
需要监控的副本场景中,这个需要监控的场景不复杂,可以直接备份。
数据库连接的事务管理就是使用备忘录模式。
注意事项
备忘录的生命周期。备忘录创建后就要在最近就使用,不能拖的太长。
备忘录的性能。不要频繁的使用备忘录。每次创建一个备份都要消耗资源。