备忘录模式用来恢复一个对象的状态到以前的状态。 通俗的说,就是把一个类的属性临时的保存在另一个地方,并提供一个接口可以还原,比较适用的场景是系统升级,代码回滚。
备忘录模式包含以下几个角色:
考虑平时玩的通关游戏,每走一步时步数都加一,遇到道具可以快速走几步,或者减几步。用备忘录模式的思想来实现这个逻辑。
游戏类:
class Game { /** * 玩家走的步数 */ private int playerStep; /** * 备份游戏 */ public GameMemento createGameMemento() { return new GameMemento(playerStep); } /** * 开始玩游戏 */ public void play() { playerStep = 0; } /** * 恢复备份 */ public void restore(GameMemento gameMemento) { this.playerStep = gameMemento.getPlayerSteps(); } }
备份
/** * 备份 */ class GameMemento { /** * 步数 */ private int playerSteps; /** * 备份步数 */ public GameMemento(int playerSteps) { this.playerSteps = playerSteps; } }
备份信息管理类
/** * 备份信息管理类 */ public class Caretaker { /** * 备份 */ private GameMemento gameMemento; /** * 恢复备份 */ public GameMemento retrieveMemento() { return this.gameMemento; } /** * 保存备份 */ public void saveMemento(GameMemento gameMemento) { this.gameMemento = gameMemento; } }
测试
public class Player { public static void main(String[] args) { Game game = new Game(); System.out.println("游戏开始,捡到滑板,前进10步"); game.setPlayerStep(10); //备份当前状态 System.out.println("备份当前状态"); GameMemento gameMemento = game.createGameMemento(); Caretaker caretaker = new Caretaker(); caretaker.saveMemento(gameMemento); System.out.println("备份完成"); game.play(); System.out.println("踩到便便了,当前步数为:" + game.getPlayerStep()); System.out.println("还原到之前一步"); game.restore(caretaker.retrieveMemento()); System.out.println("恢复完成,当前玩家步数是:" + game.getPlayerStep()); } }
优点:
当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。
备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。
缺点:
在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。
原文:https://www.cnblogs.com/rouqinglangzi/p/11760953.html