备忘录模式指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将对象恢复到原先保存的状态。
适合备忘录模式的情景如下:
- 必须保存某对象在某一时刻的部分或全部状态信息,以便对象恢复到该时刻的运行状态
- 一个对象不想通过提供public权限的方法让其他对象得到自己的内部状态
备忘录模式包含三种角色,如下:
- Memento:备忘录,负责存储原发者状态的对象
- Caretaker:负责人,负责管理保存备忘录的对象
- Originator:原发者,负责创建一个备忘录来记录当前对象的内部状态,并可使用备忘录恢复内部状态。
(1)创建备忘录类
备忘录类有一个状态属性
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
(2)创建原发者类
原发者类也有一个状态属性,有两个方法:
saveStateToMemento:把当前状态存入备忘录中 getStateFromMemento:从备忘录中获取一个状态
public class Originator {
private String state;
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
public Memento saveStateToMemento(){
return new Memento(state);
}
public void getStateFromMemento(Memento Memento){
state = Memento.getState();
}
}
(3)创建负责人类
创建一个备忘录的列表,用于存储不同的状态。同时也能根据下标获取某个状态。
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state){
mementoList.add(state);
}
public Memento get(int index){
return mementoList.get(index);
}
}
(4)测试类
public class Test {
public static void main(String[] args) {
//创建原发者
Originator originator = new Originator();
//创建负责人
CareTaker careTaker = new CareTaker();
originator.setState("状态1");
careTaker.add(originator.saveStateToMemento()); //保存状态1
originator.setState("状态2");
careTaker.add(originator.saveStateToMemento()); //保存状态2
originator.setState("状态3");
System.out.println("当前状态: " + originator.getState());
//恢复到状态一的时候
originator.getStateFromMemento(careTaker.get(0));
System.out.println("第一次保存的状态: " + originator.getState());
//恢复到状态二的时候
originator.getStateFromMemento(careTaker.get(1));
System.out.println("第二次保存的状态: " + originator.getState());
}
}
测试结果:
当前状态: 状态3
第一次保存的状态: 状态1
第二次保存的状态: 状态2