一个游戏角色攻击的小程序:
public class Program {
public static void main(String[] args) {
// 大战boss前
GameRole lixiaoyao = new GameRole();
lixiaoyao.getInitState();
lixiaoyao.stateDisplay();
// 保存进度
GameRole backup = new GameRole();
backup.setVit(lixiaoyao.getVit());
backup.setAtk(lixiaoyao.getAtk());
// 大战 Boss 是,损耗严重
lixiaoyao.fight();
lixiaoyao.stateDisplay();
// 恢复之前状态
lixiaoyao.setAtk(backup.getAtk());
lixiaoyao.setVit(backup.getVit());
lixiaoyao.stateDisplay();
}
}
class GameRole {
// 生命力
private int vit;
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
// 攻击力
private int atk;
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
// 状态显示
public void stateDisplay() {
System.out.println("角色当前状态:");
System.out.println("体力:" + getVit());
System.out.println("攻击力:" + getAtk());
}
// 获得初始状态
public void getInitState() {
setVit(100);
setAtk(100);
}
// 战斗
public void fight() {
setVit(0);
setAtk(0);
}
}
采用备忘录模式改进后:
public class Program {
public static void main(String[] args) {
// 大战boss前
GameRole lixiaoyao = new GameRole();
lixiaoyao.getInitState();
lixiaoyao.stateDisplay();
// 保存进度
RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
stateAdmin.setMemento(lixiaoyao.saveState());
// 大战 Boss 是,损耗严重
lixiaoyao.fight();
lixiaoyao.stateDisplay();
// 恢复之前状态
lixiaoyao.recoveryState(stateAdmin.getMemento());
lixiaoyao.stateDisplay();
}
}
// 角色状态存储箱
class RoleStateMemento {
private int vit;
private int atk;
public RoleStateMemento(int vit, int atk) {
this.vit = vit;
this.atk = atk;
}
// 生命力
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
// 攻击力
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
}
// 角色状态管理者
class RoleStateCaretaker {
private RoleStateMemento memento;
public RoleStateMemento getMemento() {
return memento;
}
public void setMemento(RoleStateMemento memento) {
this.memento = memento;
}
}
class GameRole {
// 生命力
private int vit;
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
// 攻击力
private int atk;
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
// 状态显示
public void stateDisplay() {
System.out.println("角色当前状态:");
System.out.println("体力:" + getVit());
System.out.println("攻击力:" + getAtk());
}
// 获得初始状态
public void getInitState() {
setVit(100);
setAtk(100);
}
// 战斗
public void fight() {
setVit(0);
setAtk(0);
}
// 保存角色状态
public RoleStateMemento saveState() {
return (new RoleStateMemento(vit,atk));
}
// 恢复角色状态
public void recoveryState(RoleStateMemento memento) {
setVit(memento.getVit());
setAtk(memento.getAtk());
}
}
备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。