备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象
实现模式需要的角色如下:
发起人角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,具备状态回滚功能
备忘录角色(Memento):用于存储Originator的内部状态,可以防止Originator以外的对象访问
备忘录管理员角色(Caretaker):负责存储。提供管理员备忘录,无法对备忘录内容进行操作和访问。
实现代码:
/**
* <p>
*备忘录角色
* </p>
*
* @since 2022/3/22 11:01
*/
@Data
public class Memento {
private String name;
private String major;
public Memento(Originator originator) {
this.name = originator.getName();
this.major = originator.getMajor();
}
}
/**
* <p>
* 备忘录模式-备忘录发起角色
* </p>
*
* @since 2022/3/22 11:01
*/
@Data
@AllArgsConstructor
public class Originator {
private String name;
private String major;
//产生新的备忘录
public Memento memoOperation() {
return new Memento(this);
}
// 恢复备忘录
public void recoverOperation(Memento memento) {
this.name = memento.getName();
this.major = memento.getMajor();
}
}
/**
* <p>
* 备忘录管理角色
* </p>
*
* @since 2022/3/22 11:06
*/
public class CareTaker {
// 备忘录 存储
private final Stack<Memento> stack = new Stack<>();
public void setMemento(Memento memento) {
stack.push(memento);
}
public Memento getMemento() {
if (!stack.empty()) {
return stack.pop();
}
return null;
}
}
测试代码:
/**
* <p>
* 备忘录模式
* </p>
*
* @since 2022/3/22 11:07
*/
public class Client {
public static void main(String[] args) {
Originator originator = new Originator("ale", "work");
Memento memento = originator.memoOperation();
CareTaker careTaker = new CareTaker();
careTaker.setMemento(memento);
System.out.println("最开始专业" + originator.getMajor());
originator.setMajor("test");
System.out.println("第一次专业" + originator.getMajor());
careTaker.setMemento(originator.memoOperation());
careTaker.getMemento();
Memento memento1 = careTaker.getMemento();
originator.recoverOperation(memento1);
System.out.println("转专业前" + originator.getMajor());
}
}