一、 模式定义:
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存前的状态。
二、 模式解说
在程序运行过程中,某些对象的状态处在转换过程中,可能由于某种原因需要保存此时对象的状态,以便程序运行到某个特定阶段,需要恢复到对象之前处于某个点时的状态。如果使用一些公有接口让其它对象来得到对象的状态,便会暴露对象的实现细节。
三、 结构图
1) 备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2) 备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3) 备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查。
四、一个例子
这个例子是我从网上找到的,我觉得它比较形象,就拿过来直接用了。下面是这个例子的代码:
备忘发起(Originator)角色
public class PlayRole {
private int vitality;//生命
private int aggressivity;//战斗力
private int defencivity;//防御力
public PlayRole(int vitality, int aggressivity, int defencivity) {
super();
this.vitality = vitality;
this.aggressivity = aggressivity;
this.defencivity = defencivity;
}
public PlayRole() {}
public int getVitality() {
return vitality;
}
public void setVitality(int vitality) {
this.vitality = vitality;
}
public int getAggressivity() {
return aggressivity;
}
public void setAggressivity(int aggressivity) {
this.aggressivity = aggressivity;
}
public int getDefencivity() {
return defencivity;
}
public void setDefencivity(int defencivity) {
this.defencivity = defencivity;
}
public RoleMemento createMemento() {
RoleMemento memento = new RoleMemento();
memento.setAggressivity(aggressivity);
memento.setDefencivity(defencivity);
memento.setVitality(vitality);
return memento;
}
public void setMemento(RoleMemento memento) {
this.aggressivity = memento.getAggressivity();
this.defencivity = memento.getDefencivity();
this.vitality = memento.getVitality();
}
public void showState() {
System.out.println("攻击力:"+this.aggressivity+" 防御力:"+this.defencivity+" 生命力:"+this.vitality);
}
}
备忘录(Memento)角色
public class RoleMemento {
private int vitality;
private int aggressivity;
private int defencivity;
public void setVitality(int vitality) {
this.vitality = vitality;
}
public void setAggressivity(int aggressivity) {
this.aggressivity = aggressivity;
}
public void setDefencivity(int defencivity) {
this.defencivity = defencivity;
}
public int getVitality() {
return vitality;
}
public int getAggressivity() {
return aggressivity;
}
public int getDefencivity() {
return defencivity;
}
}
备忘录管理者(Caretaker)角色
public class Caretaker {
RoleMemento memento;
public RoleMemento getMemento() {
return memento;
}
public void setMemento(RoleMemento memento) {
this.memento = memento;
}
}
客户测试
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 新建角色
PlayRole role = new PlayRole(100, 100, 100);
// 新建管理者
Caretaker taker = new Caretaker();
// 角色初始状态
System.out.println("游戏刚开始,角色各属性:");
role.showState();
// 利用备忘录模式保存当前状态
System.out.println("【保存游戏状态!】");
taker.setMemento(role.createMemento());
role.setAggressivity(20);
role.setDefencivity(30);
role.setVitality(0);
// 大战过后,角色能力值下降
System.out.println("与Boss对战后,角色各项能力已大大下降:");
role.showState();
// 恢复保存的角色状态
role.setMemento(taker.getMemento());
System.out.println("【恢复保存的角色状态!】");
System.out.println("恢复后角色的当前状态:");
role.showState();
}
}
运行结果:
游戏刚开始,角色各属性:
攻击力:100 防御力:100 生命力:100
【保存游戏状态!】
与Boss对战后,角色各项能力已大大下降:
攻击力:20 防御力:30 生命力:0
【恢复保存的角色状态!】
恢复后角色的当前状态:
攻击力:100 防御力:100 生命力:100