备忘录模式学习笔记
基本概念
备忘录模式(Memento Pattern)是一种行为型模式,它允许在不破坏封装性的前提下捕获并外部化一个对象的内部状态,从而以后可以将该对象恢复到原先保存的状态。
备忘录模式包含三个角色:发起人角色、备忘录角色和负责人角色。发起人角色负责创建备忘录,并记录自己的当前内部状态。负责人角色负责保存备忘录,但不能对备忘录的内容进行修改。备忘录角色负责存储发起人角色的状态。
备忘录模式的优点是可以简化发起人角色的状态管理,同时可以对发起人角色的历史状态进行回滚操作。
实例
下面以游戏角色为例,演示备忘录模式的使用。
发起人角色(GameRole)
发起人角色记录游戏角色的当前状态,并可以创建备忘录和恢复状态。
javaCopy Codepublic class GameRole {
private int vit; // 生命力
private int atk; // 攻击力
private int def; // 防御力
public GameRole(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
// 定义创建备忘录的方法
public Memento createMemento() {
return new Memento(vit, atk, def);
}
// 定义从备忘录恢复状态的方法
public void restoreFromMemento(Memento memento) {
this.vit = memento.getVit();
this.atk = memento.getAtk();
this.def = memento.getDef();
}
// 定义打印角色状态的方法
public void display() {
System.out.println("角色当前状态:");
System.out.println("生命力:" + vit);
System.out.println("攻击力:" + atk);
System.out.println("防御力:" + def);
}
// 定义改变角色状态的方法
public void changeState() {
this.vit = 50;
this.atk = 80;
this.def = 60;
}
}
备忘录角色(Memento)
备忘录角色存储游戏角色的状态。
javaCopy Codepublic class Memento {
private int vit; // 生命力
private int atk; // 攻击力
private int def; // 防御力
public Memento(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
public int getVit() {
return vit;
}
public int getAtk() {
return atk;
}
public int getDef() {
return def;
}
}
负责人角色(Caretaker)
负责人角色保存备忘录。
javaCopy Codepublic class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
使用备忘录模式的示例
javaCopy Code// 创建游戏角色
GameRole role = new GameRole(100, 50, 30);
role.display();
// 保存当前状态
Caretaker caretaker = new Caretaker();
caretaker.setMemento(role.createMemento());
// 改变状态
role.changeState();
role.display();
// 恢复到之前的状态
role.restoreFromMemento(caretaker.getMemento());
role.display();
输出结果:
Copy Code角色当前状态: 生命力:100 攻击力:50 防御力:30 角色当前状态: 生命力:50 攻击力:80 防御力:60 角色当前状态: 生命力:100 攻击力:50 防御力:30
在这个示例中,我们创建了一个游戏角色角色,并使用备忘录模式来记录和恢复角色的状态。我们首先打印出角色的原始状态,然后保存当前状态。接着,我们改变角色的状态,再次打印角色的状态,然后恢复到之前保存的状态,再次打印角色的状态。
通过这个示例,我们可以看到备忘录模式的使用方法以及其优点:可以简化状态管理,记录和恢复状态,避免了状态混乱。