1. 定义
在不破坏封装性的前提下,捕获 一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
2. 代码
场景:游戏角色有血量和魔法,在大战 Boss 前保存自身的状态(血量和魔法),当大战 Boss 后血量和魔法下降,从备忘录对象恢复到大战前的状态。
// 守护者对象,保存游戏角色的状态
class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
@Data
class Memento {
private int hp;
private int mp;
public Memento(int hp, int mp) {
this.hp = hp;
this.mp = mp;
}
}
@Data
class GameRole {
private int hp;
private int mp;
public Memento createMemento() {
return new Memento(hp, mp);
}
public void recoverGameRoleFromMemento(Memento memento) {
this.hp = memento.getHp();
this.mp = memento.getMp();
}
public void display() {
System.out.println("当前血量:" + this.hp + ",当前魔法:" + this.mp);
}
}
public class Client {
public static void main(String[] args) {
GameRole gameRole = new GameRole();
gameRole.setHp(100);
gameRole.setMp(100);
System.out.println("--- 战斗Boss前状态 ---");
gameRole.display();
Caretaker caretaker = new Caretaker();
caretaker.setMemento(gameRole.createMemento());
System.out.println("--- 战斗Boss后状态 ---");
gameRole.setHp(30);
gameRole.setMp(30);
gameRole.display();
System.out.println("--- 战斗结束 状态恢复 ---");
gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
gameRole.display();
}
}