备忘录模式
定义
备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
角色
- 发起者角色(Originator):负责创建一个备忘录用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。
- 备忘录角色(Memento):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。
- 管理者角色(CareTake):负责保存好备忘录。
示例
发起者对象
public class Originator {
private String name;
private double sal;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public MyMemento getMemento(){
return new MyMemento(this);
}
public void recover(MyMemento memento){
this.name = memento.getoName();
this.sal = memento.getoSal();
}
}
备忘录对象
public class MyMemento {
private String oName;
private double oSal;
public MyMemento(Originator originator) {
this.oName = originator.getName();
this.oSal = originator.getSal();
}
public String getoName() {
return oName;
}
public void setoName(String oName) {
this.oName = oName;
}
public double getoSal() {
return oSal;
}
public void setoSal(double oSal) {
this.oSal = oSal;
}
}
备忘录管理对象
public class CareTake {
private MyMemento memento;
public MyMemento getMemento() {
return memento;
}
public void setMemento(MyMemento memento) {
this.memento = memento;
}
}
测试类
public class MyMementoTest {
public static void main(String[] args) {
CareTake careTake = new CareTake();
Originator originator = new Originator();
originator.setName("小明");
originator.setSal(10000);
System.out.println(originator.getName()+"的薪资为:"+originator.getSal());
MyMemento memento = originator.getMemento();
careTake.setMemento(memento);
originator.setSal(20000);
System.out.println(originator.getName()+"涨薪之后的薪资为:"+originator.getSal());
originator.recover(careTake.getMemento());
System.out.println(originator.getName()+"原来的薪资为:"+originator.getSal());
}
}
分析
- 当备忘点较多时
- 使用栈或者map保存相应时间点的备忘点
- 将备忘点持久化或者序列化到本地
- 优点:备忘录模式可以把发起人内部信息对象屏蔽起来,从而可以保持封装的边界
- 缺点:如果状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象比较昂贵。