备忘录模式
一. 说明
备忘录模式是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,方便后续将该对象恢复到原先保存的状态,它是行为型模式的一种。
备忘录模式多用于客户端程序,服务端开发不常见,像我们打游戏时记录存档,打boss败了可以从存档处恢复重新打;csdn文档编辑时的撤销等等这些都是备忘录模式的思想。
二.应用场景
- 游戏的存档恢复功能
- 文档编辑器里的撤销回滚操作
- 事务管理中的回滚事务操作
- 配置中心的应用配置文件的版本记录和回滚功能
三.代码示例
备忘录模式在服务端开发中一般不太使用,在这里我们用一个简单的打游戏存档的例子表述这个模式。
我们先创建一个游戏玩家类
@Data
public class GamePlayer {
//生命值
private int vitality;
//攻击力
private int attack;
//防御力
private int defense;
public GamePlayer() {
init();
}
//状态显示
public void displayState(){
System.out.println("---------------------");
System.out.println("当前玩家状态:");
System.out.println("生命值:" + vitality);
System.out.println("攻击力:" + attack);
System.out.println("防御力:" + defense);
System.out.println("---------------------");
}
//原始状态
private void init(){
this.vitality = 100;
this.attack = 100;
this.defense = 100;
}
//与boss战斗后的状态
public void fight(){
System.out.println("与boss对战");
this.vitality = 0;
this.attack = 0;
this.defense = 0;
}
}
先简单测试一下
public static void main(String[] args) {
GamePlayer player = new GamePlayer();
player.displayState();
player.fight();
player.displayState();
}
现在加入备忘录,在打boss前保存玩家状态到备忘录,打boss失败后恢复备忘录
创建备忘录记录玩家状态值
@Data
public class PlayerStateMemento {
//生命值
private int vitality;
//攻击力
private int attack;
//防御力
private int defense;
public PlayerStateMemento(int vitality, int attack, int defense) {
this.vitality = vitality;
this.attack = attack;
this.defense = defense;
}
}
给GamePlayer加入保存进度和恢复进度的方法
@Data
public class GamePlayer {
//生命值
private int vitality;
//攻击力
private int attack;
//防御力
private int defense;
public GamePlayer() {
init();
}
//状态显示
public void displayState(){
System.out.println("---------------------");
System.out.println("当前玩家状态:");
System.out.println("生命值:" + vitality);
System.out.println("攻击力:" + attack);
System.out.println("防御力:" + defense);
System.out.println("---------------------");
}
//原始状态
private void init(){
this.vitality = 100;
this.attack = 100;
this.defense = 100;
}
//与boss战斗后的状态
public void fight(){
System.out.println("与boss对战");
this.vitality = 0;
this.attack = 0;
this.defense = 0;
}
//保存游戏状态
public PlayerStateMemento saveState(){
System.out.println("保存游戏进度");
return new PlayerStateMemento(this.vitality, this.attack, this.defense);
}
//恢复角色状态
public void recoveryState(PlayerStateMemento memento){
System.out.println("恢复游戏进度");
this.vitality = memento.getVitality();
this.attack = memento.getAttack();
this.defense = memento.getDefense();
}
}
新增一个控制备忘录的管理者,用来临时记录备忘录
@Data
public class PlayerStateCaretaker {
private PlayerStateMemento memento;
}
编写测试代码
public static void main(String[] args) {
GamePlayer player = new GamePlayer();
player.displayState();
//保存游戏进度
PlayerStateCaretaker caretaker = new PlayerStateCaretaker();
caretaker.setMemento(player.saveState());
//大战boss
player.fight();
player.displayState();
//失败后游戏进度恢复
player.recoveryState(caretaker.getMemento());
player.displayState();
}