描述
备忘录模式(Memento Pattern)是一种行为设计模式,它允许将对象的状态保存到备忘录对象中,以便稍后可以将其恢复到先前的状态。备忘录模式通常用于需要撤销或回滚操作的场景。
在备忘录模式中,有三个主要的角色:
- Originator(原发器):它是需要保存状态的对象,它创建一个备忘录并在备忘录中存储其状态。
- Memento(备忘录):它存储原发器对象的状态。备忘录可以具有不同的权限级别来防止其他对象访问它们的状态。
- Caretaker(负责人):它负责存储备忘录对象,但不能修改备忘录对象。
实现
备忘录
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
@Override
public String toString() {
return "备忘录的状态为:"+state;
}
}
原发器
public class Originator {
private String state;
public Originator(String state) {
this.state = state;
}
public Memento saveToMemento() {
return new Memento(state);
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
负责人
public class Caretaker {
private List<Memento> mementos;
public Caretaker(){
mementos = new ArrayList<>();
}
public Memento getMemento(int index){
return mementos.get(index);
}
public void addMemento(Memento memento){
mementos.add(memento);
}
}
客户端
public class Client {
public static void main(String[] args) {
Originator originator = new Originator("state 0");
Caretaker caretaker = new Caretaker();
caretaker.addMemento(originator.saveToMemento());
originator.setState("state 1");
caretaker.addMemento(originator.saveToMemento());
System.out.println(caretaker.getMemento(0));
System.out.println(caretaker.getMemento(1));
}
}
实现结果
使用场景
-
撤销操作:备忘录模式可以用于实现撤销操作。当需要撤销某个操作时,可以先创建一个备忘录对象来保存当前状态,然后执行该操作并更新对象状态。如果需要撤销该操作,可以恢复之前保存的状态。
-
事务回滚:备忘录模式可以用于实现事务回滚功能。当执行一个事务时,可以在执行之前创建一个备忘录对象来保存当前状态。如果事务执行失败,可以恢复之前保存的状态。
-
快照功能:备忘录模式可以用于实现快照功能。例如,在编辑器中,可以使用备忘录模式来保存当前文档的状态,并在需要时恢复该状态。
-
防止对象状态丢失:备忘录模式可以用于防止对象状态丢失。例如,在一个复杂的系统中,如果一个对象的状态可能会被其他对象修改,可以使用备忘录模式来保存该对象的状态,并在需要时恢复该状态。
-
多状态保存:备忘录模式可以用于保存多个状态。例如,在一个游戏中,可以使用备忘录模式来保存玩家的多个状态,如金币数、经验值、等级等,以便在需要时恢复这些状态。