我更喜欢把它叫做备份模式
考虑这样一种场景:在我们做实验的时候,我们必须保证一步一步的做,并且在实验当前必须保证我前面的步骤都是正确的?不然如果出了问题,你都不知道是哪一步出的问题,好吧,如果你能保证前面的都正确,那么你在做下一步的时候,就要考虑我是不是能把情况恢复到这里,因为你下一步可能出错,所以你要有恢复的能力啊!这样你就得懂得备份,如果程序在下一步出现问题,你就用备份恢复一下。
好吧,我可以将当前状态备份起来不就行了嘛?
备忘录模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将对象恢复到原先保存的状态。
备忘录模式的三个角色:
Originator 发起人角色
记录当前时刻得内部状态,负责定义那些属于备份范围的状态,负责创建和恢复备忘录数据
MeMennto 备忘录角色
负责存储当前的对象的内部状态,在需要的时候提供发起人保存起来的内部状态
Caretaker 备忘录管理员角色,它可以让我们在场景类里面不知道备忘录角色的存在,直接使用管理员就可以了。
package com.gengu.备忘录;
/**
* 现在用实验类模拟我们的场景
* 实验中所有一个状态,当我们在往下去做一个实验的时候总是希望能正确
* 不过错误是在所难免的,那么我们在实验失败的时候总是希望能回到上次正确的地方再做尝试
* 那么这种应用刚好可以被备忘录模式所使用
* */
public class Experiment {
private String state = "到目前为止还是成功的";
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//设置备份
public Memento createMemento(){
return new Memento(this.state);
}
//恢复一个备份
public void restoreMemento(Memento memento){
this.setState(memento.getState());
}
}
package com.gengu.备忘录;
/**
* 这个就是备忘录
* */
public class Memento {
//实验的状态
private String state = "";
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento(String state){
this.state = state;
}
}
package com.gengu.备忘录;
public class Manager {
Memento memento = null;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
场景类
package com.gengu.备忘录;
public class Client {
public static void main(String[] args) {
//现在做实验
Experiment experiment = new Experiment();
System.out.println("没做之前的状态为"+experiment.getState());
//做一个备份
Manager manager = new Manager();
manager.setMemento(experiment.createMemento());
experiment.setState("失败了");
System.out.println("继续下一步的时候发现"+experiment.getState());
//下面一步就是恢复现场
experiment.restoreMemento(manager.getMemento());
System.out.println("又将实验的状态恢复成"+experiment.getState());
}
}
备忘录模式我更愿意叫他备份模式,备份的作用就是为了恢复现场,他主要使用在需要保存和恢复数据的相关状态场景,提供一个可回滚的操作,就想CTRL+z的操作。