备忘录模式 Memento
- 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
- 简单的说将一个对象的一些属性 保存在一个Memento对象中,用一个Caretaker类来专门管理Mento对象,如果需要回滚到对象的某一个状态直接去Caretaker中去找对应的Memento回滚即可
核心角色
- Originator 需要被保存状态的对象
- Memento 备忘录对象用来保存记录Originator的一些状态属性
- Caretaker 守护者对象用于保存Memento对象
UML 示意图
代码实现
@Data
public class Original {
private String state;
public Memento saveMemento() {
return new Memento(state);
}
public void rollback(Memento memento) {
this.state = memento.getState();
}
}
@Getter
public class Memento {
public Memento(String state) {
this.state = state;
}
private String state;
}
public class CareTaker {
private List<Memento> mementos = new ArrayList<>();
public void add(Memento memento){
this.mementos.add(memento);
}
public Memento get(int index){
return this.mementos.get(index);
}
}
public class MementoTest {
public static void main(String[] args) {
CareTaker careTaker = new CareTaker();
Original original = new Original();
original.setState("init state");
System.out.println(original);
careTaker.add(original.saveMemento());
original.setState("state 2 ");
System.out.println(original);
original.setState("state 3");
System.out.println(original);
original.rollback(careTaker.get(0));
System.out.println(original);
}
}
使用细节
- 如果原始类的成员变量需要保存的过多,会导致占用比较大的资源,每次保存都是要消耗内存
- 如果需要保存不同类型的状态或者更加明晰化的管理可以把Caretaker中的容器改成Map或者其他
- 在节约内存的角度上可以考虑让备忘录结合原型模式配合
资源,每次保存都是要消耗内存
- 如果需要保存不同类型的状态或者更加明晰化的管理可以把Caretaker中的容器改成Map或者其他
- 在节约内存的角度上可以考虑让备忘录结合原型模式配合
- 适用于需要回滚的操作