概述
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式
备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态
主要解决:
允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作
何时使用:
优缺点
优点:
缺点:
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态

角色分配
Memento:备忘录
Originator:原发器
Caretaker:负责人
package com.vinjcent.prototype.memento;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author vinjcent
* @description 备忘录
* @since 2024/5/16 20:11
*/
@Data
public class Memento {
@ApiModelProperty(value = "状态")
private String state;
public Memento(String state) {
this.state = state;
}
}
package com.vinjcent.prototype.memento;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author vinjcent
* @description 原发器
* @since 2024/5/16 20:16
*/
@Data
public class Originator {
@ApiModelProperty(value = "状态")
private String state;
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
package com.vinjcent.prototype.memento;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author vinjcent
* @description 负责人
* @since 2024/5/16 20:23
*/
@Data
public class CareTaker {
@ApiModelProperty(value = "备忘录列表")
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
package com.vinjcent.prototype.memento;
/**
* @author vinjcent
* @description 备忘录模式
* @since 2024/5/16 20:24
*/
public class Main {
public static void main(String[] args) {
// 原发器
Originator originator = new Originator();
// 负责人
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
// 让负责人记录当前备忘录的状态
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
// 让负责人记录当前备忘录的状态
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}

