备忘录模式, 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态。
两种角色:
- Originator 待备份的对象,负责创建和恢复备份数据
- Memento 备忘录对象,记录并储存对象中的属性等
示例代码:
// 备忘录角色
public class Memento {
// 属性
private int a;
private int b;
public Memento(int a, int b){
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
// 待备份的原对象
public class Originator {
// 两个属性
private int a;
private int b;
// 备份方法
public Memento saveToMemento(){
return new Memento(this.a, this.b);
}
// 从备份中还原
public void rollbackFromMemento(Memento memento){
this.a = memento.getA();
this.b = memento.getB();
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
// 需备份的业务对象
Originator originator = new Originator();
originator.setA(3);
originator.setB(4);
// 备份到备份记录中
Memento mem = originator.saveToMemento();
System.out.println("备份中,a的值为 "+ mem.getA() +" b的值为 " + mem.getB());
// 其他业务处理,对原对象进行属性修改等操作
originator.setA(300);
originator.setB(400);
System.out.println("修改后,a的值为 "+ originator.getA() +" b的值为 " + originator.getB());
// 如果需返回原始状态,重置各个属性
originator.rollbackFromMemento(mem);
System.out.println("回滚后,a的值为 "+ originator.getA() +" b的值为 " + originator.getB());
}
}
执行结果:
备份中,a的值为 3 b的值为 4
修改后,a的值为 300 b的值为 400
回滚后,a的值为 3 b的值为 4
需要恢复数据状态的场景可以考虑使用备忘录模式。