概述:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
角色:
- Memento 备忘录存储原发器对象的内部状态
- Originator 原发器创建一个备忘录,用以记录当前时刻它的内部状态。 使用备忘录恢复内部状态
- Caretaker 负责保存好备忘录。 不能对备忘录的内容进行操作或检查
类图:
实现:
public class Originator {
private String state;
public Originator(String state) {
this.state = state;
}
//保存
public Memento createMemento() {
return new Memento(state);
}
//返回
public void history(Memento memento) {
state = memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public String toString() {
System.out.println("Originator{" +
"state='" + state + '\'' +
'}');
return "Originator{" +
"state='" + state + '\'' +
'}';
}
}
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
public class Caretaker {
private ArrayList<Memento> mementoList ;
public Memento getMemento(int i){
if(null!=mementoList){
return mementoList.get(i);
}
return null;
}
public void setMemento(Memento memento){
if(null == mementoList){
mementoList = new ArrayList<>();
}
mementoList.add(memento);
}
}
public class testMemento {
//步数标志
private static int index = 0;
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator originator = new Originator("1");
originator.toString();
caretaker.setMemento(originator.createMemento());
//每次备份,index+1
index++;
originator.setState("2");
originator.toString();
caretaker.setMemento(originator.createMemento());
index++;
originator.setState("3");
originator.toString();
originator.history(caretaker.getMemento(index-1));
//每次撤销,index-1
index--;
originator.toString();
originator.history(caretaker.getMemento(index-1));
index--;
originator.toString();
}
}
打印:
Originator{state=’1’}
Originator{state=’2’}
Originator{state=’3’}
Originator{state=’2’}
Originator{state=’1’}