概念:又称为快照模式或Token模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到原先保存的状态。通俗点说就是备份一个对象,比较典型的场景就是游戏的存档恢复。
- 发起人角色:也就是被备份的角色,这个角色定义的状态,会被Memento管理起来。
- 备忘录角色:Memento负责存储发起人的内部状态,在需要时提供给发起人它需要的状态。
- 责任人角色:该角色对备忘录角色进行管理、保存和提供备忘录。
java
public interface Originator {
void setState(String state);
String getState();
Memento createMemento();
void setMemento(Memento memento);
}
public class ConcreteOriginator implements Originator {
private String state;
@Override
public void setState(String state) {
this.state = state;
}
@Override
public String getState() {
return state;
}
@Override
public Memento createMemento() {
return new ConcreteMemento(state);
}
@Override
public void setMemento(Memento memento) {
if (memento instanceof ConcreteMemento) {
this.state = memento.getState();
}
}
}
public interface Memento {
String getState();
}
public class ConcreteMemento implements Memento {
private String state;
public ConcreteMemento(String state) {
this.state = state;
}
@Override
public String getState() {
return state;
}
}
public class CareTaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
public class Demo {
public static void main(String[] args) {
Originator originator = new ConcreteOriginator();
CareTaker caretaker = new CareTaker();
originator.setState("初始状态");
System.out.println("当前状态: " + originator.getState());
// 保存备忘录
caretaker.setMemento(originator.createMemento());
originator.setState("新状态");
System.out.println("更新后的状态: " + originator.getState());
// 恢复到备忘录中的状态
originator.setMemento(caretaker.getMemento());
System.out.println("恢复后的状态: " + originator.getState());
}
}
如果大家需要视频版本的讲解,欢迎大家关注我的B站:
【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl